Debug¶
There are numerous debug features built in to hutch-python
.
Live Session Logging¶
The first place to go when something has already gone wrong is to the log
files. These are stored in a logs
directory in the same location as the
conf.yml
file, and sorted by date and session start time.
These contain every log message from the session in the order they were called.
Each module can choose when to make calls to logger.debug
to generate
log messages, but we also log every single input line, output line, and
exception that was raised in the interactive session. Note that the input and
output lines are not available to the logger until the entire command has
executed, so the log messages immediately preceding an input log are those
that were created by calling that statement.
The logging configuration is specified by the logging.yaml
file and is
set up by the log_setup
module. If not in debug mode, only log levels
INFO
and above will make it to the terminal. The files are configured to
rotate and roll over into a second file once they get too large.
PCDS-wide Logging¶
A special Python logger for PCDS-wide logging is pre-configured within
hutch-python
. This special logger is named 'pcds-logging'
, and hooks
in with our managed logstash, ElasticSearch and Grafana stack.
To explore the data, access Grafana here.
To record information, first get the logger itself:
import logging
pcds_logger = logging.getLogger('pcds-logging')
Log messages above the configured level (by default logging.DEBUG
) will be
transmitted to the centralized log server to be recorded and indexed.
One example use case is when an important event that would be useful to see trended over time:
pcds_logger.info('I dropped the sample')
Or for exception statistics, perhaps. The following will include a full stack trace along with module and line information automatically:
- try:
1/0
- except ZeroDivisionError:
pcds_logger.exception(‘This specific thing went wrong’)
It is not necessary to include information about the host that is running Python, module versions, or thread/process names as these are automatically included.
Debug Mode¶
You can start in debug mode by passing the --debug
option to
hutch-python
. Debug mode changes the logging configuration to print
log messages of level DEBUG
and above to the screen.
Within every session, we have a few hidden objects for managing the
state of debug mode.
_debug_mode
:Used to enable, disable, or check the state of debug mode.
_debug_context
:Context manager for enabling debug mode for a block of code.
_debug_wrapper
:Wrapper for enabling debug mode for the execution of a single function.
_debug_console_level
:Utility function for setting the console’s logging level to an arbitrary value.
_debug_mode(True) # Turn on debug mode
_debug_mode(False) # Turn off debug mode
print(_debug_mode()) # Check debug mode
# Turn on debug mode for the duration of a code block
with _debug_context():
buggy_function(arg)
# Turn on debug mode for one function call
_debug_wrapper(buggy_function, arg)
Automated Test Logging¶
If you’re running the automated test suite, each test run is stored in a
module-level logs
folder. This can be useful for diagnosing why the tests
are failing.