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.
All log records are displayed in the qudi main window where they can also be filtered.
Log messages of level "error" or higher will additionally trigger a modal error dialog pop-up
displaying the error message and traceback.
⚠ WARNING:
Qudi additionally installs a global
sys.excepthook
handler 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