Add a advanced example

It uses its own API which I packed between MTApi5 and MatLab.
Possible that this is useless, but errors from the .NET assembly are more tradable.
This commit is contained in:
Christian_x7
2020-10-24 10:14:58 +02:00
parent 9eedf15e9e
commit 76a6216cf7
35 changed files with 7125 additions and 0 deletions
@@ -0,0 +1,154 @@
# 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!