Logging
Qudi uses the logging module from the Python standard library to
manage log messages. Please refer to the official Python
documentation to get
familiar with the concept.
Running qudi will initialize the qudi.core.logger module which
configures the logging module settings and installs log handlers in
order to centrally manage all log messages.
⚠ WARNING:
Qudi additionally installs a global
sys.excepthookhandler to catch all unhandled exceptions and prevent the application from terminating.All exceptions handled that way are diverted to the qudi logging facility with logging level “error”.
Furthermore, all log records are written into a text file located in the qudi subdirectory of the user home directory (OS dependent). The log files of the last 5 qudi sessions are preserved.
Levels
The predefined most common logging levels are the same as described in
the logging package documentation:
Level Name |
Numeric Value |
|---|---|
critical |
50 |
error |
40 |
warn |
30 |
info |
20 |
debug |
10 |
critical
When a log record of level “critical” and higher is detected qudi will immediately attempt to kill all running tasks and processes.
In 99.99% of the cases there should be no reason to log a record of this level. So don’t do it unless you have very good reasons and know what you are doing.
error
Records of level “error” or higher should usually only be logged while handling an exception (see: exception handling guidelines).
Unhandled exceptions will automatically be logged on the “error” level.
warn
Warning messages can be used as a tool by application programmers to point out possible problems, e.g. an occurring edge case that is not yet well handled and often leads to errors.
info
Info messages should be used by an application programmer to inform the user of major events or milestones in the intended program execution flow.
⚠ WARNING:
There is a fine line between spam and useful information density.Think carefully what to log and use “debug” level while developing code and debugging.
debug
Use debug messages for information only interesting for programmers,
e.g. to simplify debugging. Records of this level and below are ignored
by default and are not logged unless you run qudi in debug mode (command
line argument --debug).
Usage
The usual way to create a log record is to get a logging.Logger
instance and call the level names on it with the desired log message as
argument, i.e.:
<logger>.debug('my debug message')
<logger>.info('my info message')
<logger>.warn('my warning message')
<logger>.error('my error message')
<logger>.critical('my critical message')
For this purpose you want to include the traceback in the log record.
You can do this easily by calling exception on the logger instance:
try:
0/0
except ZeroDivisionError:
# This will include the traceback in the log record:
<logger>.exception('There was an exception while trying to divide two numbers')
qudi Measurement Modules
The base class of any qudi measurement
module already provides you with an
appropriate Logger object that can be accessed with the log
property:
from qudi.core.module import LogicBase
class MyExampleLogic(LogicBase):
""" Module description goes here """
...
def add_numbers(self, x, y):
""" Just a basic example method to add two numbers and log an info message. """
result = x + y
self.log.info(f'Just added two number {x} and {y} resulting in {result}')
return result
...
Other modules
For any module that is not a qudi measurement module but part of the
qudi package namespace, you should use get_logger from
qudi.core.logger and initialize the logger with the modules
__name__ attribute:
from qudi.core.logger import get_logger
logger = get_logger(__name__)
logger.info('Module initialized') # create example log record
For any other Python module you can simply get a Logger object as
described in the official Python
documentation:
from logging import getLogger
logger = getLogger(__name__)
logger.info('Module initialized') # create example log record