mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-07-28 11:07:48 +00:00
155 lines
7.0 KiB
Markdown
155 lines
7.0 KiB
Markdown
|
|
# Logging for Matlab
|
||
|
|
|
||
|
|
This simple logging module is a modification of [`log4m`](http://goo.gl/qDUcvZ)
|
||
|
|
with the following improvements:
|
||
|
|
|
||
|
|
* multiple loggers can be created and retrieved by name (à la Python)
|
||
|
|
* different logging levels appear in different colors if using Matlab in the terminal
|
||
|
|
|
||
|
|
Each logger's output can be directed to the standard output and/or to a file.
|
||
|
|
|
||
|
|
Each logger is assigned a logging level that will control the amount of output.
|
||
|
|
The possible levels are, from high to low:
|
||
|
|
|
||
|
|
* ALL (highest)
|
||
|
|
* TRACE
|
||
|
|
* DEBUG
|
||
|
|
* INFO (default)
|
||
|
|
* WARNING
|
||
|
|
* ERROR
|
||
|
|
* CRITICAL
|
||
|
|
* OFF (lowest)
|
||
|
|
|
||
|
|
The default level in INFO.
|
||
|
|
If a logger outputs at a level lower than or equal to its assigned level, the output will be logged.
|
||
|
|
To silence a logger, set its level to OFF.
|
||
|
|
|
||
|
|
All loggers output a string according to the Matlab format `'%-s %-23s %-8s %s\n'`.
|
||
|
|
Note that a newline is always appended, so there is no need to terminate log lines
|
||
|
|
with a newline.
|
||
|
|
The format is as follows:
|
||
|
|
* `%-s` is used to display the caller name, i.e., the function or method in which
|
||
|
|
logging occured
|
||
|
|
* `%-23s` is used for a time stamp of the form `2016-09-14 14:23:44,271`
|
||
|
|
* `%-8s` is used for the logging level
|
||
|
|
* `%s` is used for the message to be logged.
|
||
|
|
|
||
|
|
## API
|
||
|
|
|
||
|
|
An instance of the `logging` class is created using the `logging.getLogger` function.
|
||
|
|
The first argument for this function must be the name of the logger. Four additional
|
||
|
|
optional arguments are also available. These can either be provided as name/value
|
||
|
|
pairs (such as `logger.getlogger(name, 'path', path)`) or as a struct where the
|
||
|
|
field names are the names of the argument (such as `logger.getlogger(name, struct('path', path)`).
|
||
|
|
The available arguments are:
|
||
|
|
|
||
|
|
* `path`: The path to the log file. If this is not specified or is an empty string,
|
||
|
|
then logging to a file is disabled.
|
||
|
|
This must be a string.
|
||
|
|
* `logLevel`: set the file log level.
|
||
|
|
Only log entries with a level greater than or equal to this level will be saved.
|
||
|
|
This can either be a string or an integer.
|
||
|
|
Note that this argument will be ignored if `path` is empty or not specified.
|
||
|
|
* `commandWindowLevel`: set the command window log level.
|
||
|
|
Only log entries with a level greater than or equal to this level will be displayed.
|
||
|
|
This can either be a string or an integer.
|
||
|
|
* `datefmt`: the date/time format string.
|
||
|
|
This contains the date/time format string used by the logs.
|
||
|
|
The format must be compatible with the built-in `datestr` function.
|
||
|
|
This must be a string.
|
||
|
|
|
||
|
|
If `logger` is an instance of the `logging` class, the following methods can be used
|
||
|
|
to log output at different levels:
|
||
|
|
|
||
|
|
* `logger.trace(string)`: output `string` at level TRACE.
|
||
|
|
This level is mostly used to trace a code path.
|
||
|
|
* `logger.debug(string)`: output `string` at level DEBUG.
|
||
|
|
This level is mostly used to log debugging output that may help identify an issue
|
||
|
|
or verify correctness by inspection.
|
||
|
|
* `logger.info(string)`: output `string` at level INFO.
|
||
|
|
This level is intended for general user messages about the progress of the program.
|
||
|
|
* `logger.warn(string)`: output `string` at level WARNING (unrelated to Matlab's `warning()` function).
|
||
|
|
This level is used to alert the user of a possible problem.
|
||
|
|
* `logger.error(string)`: output `string` at level ERROR (unrelated to Matlab's `error()` function).
|
||
|
|
This level is used for non-critical errors that can endanger correctness.
|
||
|
|
* `logger.critical(string)`: output `string` at level CRITICAL
|
||
|
|
This level is used for critical errors that definitely endanger correctness.
|
||
|
|
|
||
|
|
The following utility methods are also available:
|
||
|
|
|
||
|
|
* `logger.setFileName(string)`: set the log file to `string`.
|
||
|
|
This can be used to specify or change the file logs are saved to.
|
||
|
|
* `logger.setCommandWindowLevel(level)`: set the command window log level to `level`.
|
||
|
|
Only log entries with a level greater than or equal to `level` will be displayed.
|
||
|
|
`level` can either be a string or an integer.
|
||
|
|
* `logger.setLogLevel(level)`: set the file log level to `level`.
|
||
|
|
Only log entries with a level greater than or equal to `level` will be saved.
|
||
|
|
`level` can either be a string or an integer.
|
||
|
|
Note that even if the level is changed, nothing will be written if a valid
|
||
|
|
filename has not been set for the log.
|
||
|
|
|
||
|
|
The following properties can be read or written:
|
||
|
|
|
||
|
|
* `logger.datefmt`: the date/time format string.
|
||
|
|
This contains the date/time format string used by the logs.
|
||
|
|
The format must be compatible with the built-in `datestr` function.
|
||
|
|
* `logger.commandWindowLevel`: the command window log level.
|
||
|
|
Only log entries with a level greater than or equal to `level` will be displayed.
|
||
|
|
It can be set with either a string or an integer, but will always return an integer.
|
||
|
|
* `logger.logLevel`: the file log level.
|
||
|
|
Only log entries with a level greater than or equal to `level` will be saved.
|
||
|
|
It can be set with either a string or an integer, but will always return an integer.
|
||
|
|
|
||
|
|
The following properties are read-only (note that these are called in a different way):
|
||
|
|
|
||
|
|
* `logging.logging.ALL`: The integer value for the `ALL` level (0).
|
||
|
|
* `logging.logging.TRACE`: The integer value for the `TRACE` level (1).
|
||
|
|
* `logging.logging.DEBUG`: The integer value for the `DEBUG` level (2).
|
||
|
|
* `logging.logging.INFO`: The integer value for the `INFO` level (3).
|
||
|
|
* `logging.logging.WARNING`: The integer value for the `WARNING` level (4).
|
||
|
|
* `logging.logging.ERROR`: The integer value for the `ERROR` level (5).
|
||
|
|
* `logging.logging.CRITICAL`: The integer value for the `CRITICAL` level (6).
|
||
|
|
* `logging.logging.OFF`: The integer value for the `OFF` level (6).
|
||
|
|
Note that there is no corresponding write method for this level,
|
||
|
|
so if this level is set no logging will take place.
|
||
|
|
|
||
|
|
## Examples
|
||
|
|
|
||
|
|
A logger at default level INFO logs messages at levels INFO, WARNING, ERROR and CRITICAL, but not at levels TRACE or DEBUG:
|
||
|
|
|
||
|
|
```matlab
|
||
|
|
>> addpath('/path/to/logging4matlab')
|
||
|
|
>> logger = logging.getLogger('mylogger') % new logger with default level INFO
|
||
|
|
>> logger.info('life is just peachy')
|
||
|
|
logging.info 2016-09-14 15:10:06,049 INFO life is just peachy
|
||
|
|
>> logger.debug('Easy as pi! (Euclid)') % produces no output
|
||
|
|
>> logger.critical('run away!')
|
||
|
|
logging.critical 2016-09-14 15:12:37,652 CRITICAL run away!
|
||
|
|
```
|
||
|
|
|
||
|
|
A logger's assigned level for the command window (or terminal) can be changed:
|
||
|
|
|
||
|
|
```matlab
|
||
|
|
>> logger.setCommandWindowLevel(logging.logging.WARNING)
|
||
|
|
```
|
||
|
|
|
||
|
|
A logger can also output to file:
|
||
|
|
|
||
|
|
```matlab
|
||
|
|
>> logger2 = logging.getLogger('myotherlogger', 'path', '/tmp/logger2.log')
|
||
|
|
>> logger.setLogLevel(logging.logging.WARNING)
|
||
|
|
```
|
||
|
|
|
||
|
|
Output to either the command window or a file can be suppressed with `logging.logging.OFF`.
|
||
|
|
|
||
|
|
# FAQ
|
||
|
|
|
||
|
|
1. *Why is there no colored logging in the Matlab command window?*
|
||
|
|
I haven't gotten around to evaluating the performance of [`cprintf`](https://goo.gl/Nw5OOy),
|
||
|
|
which seems to be the only viable option for colored output in the command window.
|
||
|
|
Pull request welcome!
|
||
|
|
2. *Can I change the colors?*
|
||
|
|
Currently, no, but feel free to submit a pull request!
|
||
|
|
3. *Can I change the format string used by loggers?*
|
||
|
|
Currently, no, but feel free to submit a pull request!
|