qmi.core.logging_init

Initialization of the Python logging framework for QMI.

Logging framework can be configured using the “logging” and “log_dir” sections of the QMI configuration file, e.g.:

```json {

# Log level for messages to the console. “logging”: {

“console_loglevel”: “DEBUG”, “logfile”: “debug.log”, “loglevels”: {

“qmi.core.rpc”: “ERROR”, “qmi.core.task”: “ERROR”

}, “max_bytes”: 1000000, “backup_count”: 2

}, # Directory to write various log files. “log_dir”: “${qmi_home}/log_dir”,

“contexts”: …

}

to show DEBUG info on the console, and to write into max three log files (the latest log and two backups) of max size of 1MB. The location of the log file named ‘debug.log’ is in ‘log_dir’ folder of the QMI home directory. The loglevel setting is overridden with module-specific settings, for modules qmi.core.rpc and qmi.core.task, to be “ERROR”.

The default [log levels](https://docs.python.org/3/library/logging.html#logging-levels) for QMI are “INFO” for the log file and “WARNING” for the console. The standard log file name is ‘qmi.log’.

Functions

start_logging([loglevel, console_loglevel, ...])

Initialize the Python logging framework for use by QMI.

Classes

WatchedRotatingFileHandler(filename, **kwargs)

class qmi.core.logging_init.WatchedRotatingFileHandler(filename, **kwargs)
emit(record)

Emit a record.

Output the record to the file, catering for rollover as described in doRollover().

acquire()

Acquire the I/O thread lock.

addFilter(filter)

Add the specified filter to this handler.

close()

Closes the stream.

createLock()

Acquire a thread lock for serializing access to the underlying I/O.

doRollover()

Do a rollover, as described in __init__().

filter(record)

Determine if a record is loggable by consulting all the filters.

The default is to allow the record to be logged; any filter can veto this and the record is then dropped. Returns a zero value if a record is to be dropped, else non-zero.

Changed in version 3.2: Allow filters to be just callables.

flush()

Flushes the stream.

format(record)

Format the specified record.

If a formatter is set, use it. Otherwise, use the default formatter for the module.

handle(record)

Conditionally emit the specified logging record.

Emission depends on filters which may have been added to the handler. Wrap the actual emission of the record with acquisition/release of the I/O thread lock. Returns whether the filter passed the record for emission.

handleError(record)

Handle errors which occur during an emit() call.

This method should be called from handlers when an exception is encountered during an emit() call. If raiseExceptions is false, exceptions get silently ignored. This is what is mostly wanted for a logging system - most users will not care about errors in the logging system, they are more interested in application errors. You could, however, replace this with a custom handler if you wish. The record which was being processed is passed in to this method.

release()

Release the I/O thread lock.

removeFilter(filter)

Remove the specified filter from this handler.

reopenIfNeeded()

Reopen log file if needed.

Checks if the underlying file has changed, and if it has, close the old stream and reopen the file to get the current stream.

rotate(source, dest)

When rotating, rotate the current log.

The default implementation calls the ‘rotator’ attribute of the handler, if it’s callable, passing the source and dest arguments to it. If the attribute isn’t callable (the default is None), the source is simply renamed to the destination.

Parameters:
  • source – The source filename. This is normally the base filename, e.g. ‘test.log’

  • dest – The destination filename. This is normally what the source is rotated to, e.g. ‘test.log.1’.

rotation_filename(default_name)

Modify the filename of a log file when rotating.

This is provided so that a custom filename can be provided.

The default implementation calls the ‘namer’ attribute of the handler, if it’s callable, passing the default name to it. If the attribute isn’t callable (the default is None), the name is returned unchanged.

Parameters:

default_name – The default name for the log file.

setFormatter(fmt)

Set the formatter for this handler.

setLevel(level)

Set the logging level of this handler. level must be an int or a str.

setStream(stream)

Sets the StreamHandler’s stream to the specified value, if it is different.

Returns the old stream, if the stream was changed, or None if it wasn’t.

shouldRollover(record)

Determine if rollover should occur.

Basically, see if the supplied record would cause the file to exceed the size limit we have.

qmi.core.logging_init.start_logging(loglevel: int | str = 20, console_loglevel: int | str = 30, logfile: str | None = None, loglevels: Mapping[str, int | str] | None = None, rate_limit: float | None = None, burst_limit: int = 1, max_bytes: int = 10737418240, backup_count: int = 5) None

Initialize the Python logging framework for use by QMI.

This function sets up logging to stderr and optional logging to a file. The maximum size of a logfile can be given, and the number of rotating logfile count as well. The maximum total logfile disk space usage will be max_bytes * backup_count. Logging of Python warnings is enabled. Unhandled exceptions are logged to file.

This function is normally called automatically by qmi.start().

Parameters:
  • loglevel – Default log level (level of the root logger). Only log messages with at least this priority will be processed.

  • console_loglevel – Log level for logging to console. Only log messages with at least this priority will be logged to screen.

  • logfile – Optional file name of the log file. When omitted, logging to file will be disabled.

  • loglevels – Optional initial log levels for specific loggers. When specified, this is a dictionary mapping logger names to their initial log levels.

  • rate_limit – Maximum number of log messages per second per logger.

  • burst_limit – Maximum number of messages that can be “saved up” for a short burst of messages.

  • max_bytes – Maximum size of a log file in bytes. Default is 10GB = 10 * 2**30.

  • backup_count – Number of backup files to be used. Default is 5.