Logging
To log with Perceval you can either use a built-in Perceval logger or the python one. By default, our logger will be used.
To log the perceval messages with the python logger, use this method:
from perceval.utils import use_python_logger
use_python_logger()
To switch back to using perceval logger, use:
from perceval.utils import use_perceval_logger
use_perceval_logger()
Note
If you use the python logger, use directly the module logging of python to configure it (except for channel configuration)
This module defines functions and classes which implement a flexible event logging system for any Perceval script.
It is build to work similarly as the python logging module.
Logger
A logger instance is created the first time Perceval is imported.
In order to use it you’ll just need to import it:
from perceval.utils import get_logger
To log a message, you can use it the same way as the python logger:
from perceval.utils import get_logger
get_logger().info('I log something as info')
# or
logger = get_logger()
logger.info('1st message')
logger.info('2nd message')
Saving log to file
By default the log are not saved in a file.
If order to enable / disable the writing of logs in a file, use the following methods:
from perceval.utils import get_logger
get_logger().enable_file()
get_logger().disable_file()
When this feature is enabled, log files are written to Perceval persistent data folder and the path of the file will be printed when your script starts writing inside it.
Levels
You can use the logger to log message at different level. Each level represent a different type of message.
The level are listed by ascending order of importance in the following table.
Log level |
Perceval call |
Usage |
---|---|---|
DEBUG |
|
Detailed technical information, typically of interest only when diagnosing problems. |
INFO |
|
Confirmation of things working as expected. |
WARNING |
|
An indication that something unexpected happened, or indicative of some problem in the near future. The software is still working as expected. |
ERROR |
|
Due to a more serious problem, the software has not been able to perform some function. |
CRITICAL |
|
A serious error, indicating that the program itself is unable to continue running normally or has crashed. |
Example
from perceval.utils import get_logger
get_logger().info('I log something as info')
get_logger().critical('I log something as critical')
Channels
You can also log in a specific channel. A channel is like a category.
Each channel can have its own configuration, which means each channel can have a different level.
If the channel is not specified, the message is logged in the user
channel.
Note
If you are a Perceval user, you should only write log in the channel user
.
Channel |
Default level |
Usage |
---|---|---|
|
off |
General info: Technical info, track the usage of features |
|
off |
Usage info about our backends or remote platform GPU (exqalibur) |
|
warning |
Channel to use as a Perceval user & warnings (such as deprecated methods or arguments) |
Example
from perceval.utils.logging import get_logger, channel
get_logger().info('I log something as info in channel user', channel.user)
To set a level for a channel, use the following method:
from perceval.utils import get_logger
get_logger().set_level(level, channel)
Example
from perceval.utils.logging import get_logger, level, channel
get_logger().set_level(level.info, channel.general)
Logger configuration
For logging to be useful, it needs to be configured, meaning setting the levels for each channel and if log are saved in a file. Setting a level for a channel means that any log with a less important level will not be displayed/saved.
In most cases, only the user & general channel needs to be so configured, since all relevant messages will be logged here.
Example
from perceval.utils.logging import get_logger, channel, level
logger = get_logger()
logger.enable_file()
logger.set_level(level.info, channel.resources)
logger.set_level(level.err, channel.general)
Note
The logger configuration can be saved on your hard drive so you don’t have to configure the logger each time you use perceval. When saved, it is written to a file in Perceval persistent data folder.
In order to configure it you have to use the LoggerConfig
.
- class perceval.utils.logging.config.LoggerConfig
This class represent the logger configuration as a dictionary and can be used to save it into persistent data. On class initialization, the configuration will be loaded from persistent data.
- disable_file()
Disable to save the log into a file in the configuration
Warning: this will not change the current logger file saving, but only the file saving of the current LoggerConfig instance
- enable_file()
Enable to save the log into a file in the configuration
Warning: this will not change the current logger file saving, but only the file saving of the current LoggerConfig instance
- reset()
Reset the logger configuration to its default value, which is: - Disable file - Channel user at level warning - Channels general & resources off
- save()
Save the current logger configuration in the persistent data
- set_level(level, channel)
Set the level of a channel in the configuration
Warning: this will not change the current logger level but only the level of the channel in the current LoggerConfig instance
- Parameters:
level (
level
) – _description_channel (
channel
) – _description_
- use_perceval_logger()
Set the config to use the perceval logger
Warning: this will not change the current logger level, but only the level of the channel in the current LoggerConfig instance
- use_python_logger()
Set the config to use the python logger
Warning: this will not change the current logger level but only the level of the channel in the current LoggerConfig instance
After configuring your LoggerConfig, you can apply it to the current logger:
from perceval.utils.logging import get_logger, LoggerConfig, level, channel
logger_config = LoggerConfig()
logger_config.enable_file()
logger_config.set_level(level.info, channel.user)
get_logger().apply_config(logger_config)
Log format
On the console the log will appear with the format:
[log_level] message
In the file, the log will be save to the format:
[yyyy-mm-dd HH:MM:SS.fff]channel_first_letter[level_first_letter] message
Log exceptions
If the general channel level is at least on critical and save in file is enable, uncaught exception will be logged and saved on disk with their callstack.