easybuild.base.fancylogger module¶
This module implements a fancy logger on top of python logging
- It adds:
- custom specifiers for mpi logging (the mpirank) with autodetection of mpi
- custom specifier for always showing the calling function’s name
- rotating file handler
- a default formatter.
- logging to an UDP server (vsc.logging.logdaemon.py f.ex.)
- easily setting loglevel
- easily add extra specifiers in the log record
- internal debugging through environment variables
- FANCYLOGGER_GETLOGGER_DEBUG for getLogger FANCYLOGGER_LOGLEVEL_DEBUG for setLogLevel
- set FANCYLOGGER_IGNORE_MPI4PY to disable mpi4py module import
- mpi4py (when available) is automatically used for mpi-aware log format In case mpi4py however that it is available but broken, set this variable to 1 to avoid importing it.
usage:
>>> from easybuild.base import fancylogger
>>> # will log to screen by default
>>> fancylogger.logToFile('dir/filename')
>>> fancylogger.setLogLevelDebug() # set global loglevel to debug
>>> logger = fancylogger.getLogger(name) # get a logger with a specific name
>>> logger.setLevel(level) # set local debugging level
>>> # If you want the logger to be showing modulename.functionname as the name, use
>>> fancylogger.getLogger(fname=True)
>>> # you can use the handler to set a different formatter by using
>>> handler = fancylogger.logToFile('dir/filename')
>>> formatstring = '%(asctime)-15s %(levelname)-10s %(mpirank)-5s %(funcname)-15s %(threadName)-10s %(message)s'
>>> handler.setFormatter(logging.Formatter(formatstring))
>>> # setting a global loglevel will impact all logers:
>>> from easybuild.base import fancylogger
>>> logger = fancylogger.getLogger("test")
>>> logger.warning("warning")
2012-01-05 14:03:18,238 WARNING <stdin>.test.<module> MainThread warning
>>> logger.debug("warning")
>>> fancylogger.setLogLevelDebug()
>>> logger.debug("warning")
2012-01-05 14:03:46,222 DEBUG <stdin>.test.<module> MainThread warning
- Logging to a udp server:
- set an environment variable FANCYLOG_SERVER and FANCYLOG_SERVER_PORT (optionally)
- this will make fancylogger log to that that server and port instead of the screen.
author: | Jens Timmerman (Ghent University) |
---|---|
author: | Stijn De Weirdt (Ghent University) |
author: | Kenneth Hoste (Ghent University) |
-
class
easybuild.base.fancylogger.
FancyLogRecord
(*args, **kwargs)¶ Bases:
logging.LogRecord
This class defines a custom log record. Adding extra specifiers is as simple as adding attributes to the log record
-
class
easybuild.base.fancylogger.
FancyLogger
(name, level=0)¶ Bases:
logging.Logger
This is a custom Logger class that uses the FancyLogRecord and has extra log methods raiseException and deprecated and streaming versions for debug,info,warning and error.
-
RAISE_EXCEPTION_CLASS
¶ alias of
builtins.Exception
-
RAISE_EXCEPTION_LOG_METHOD
(msg)¶
-
deprecated
(msg, cur_ver, max_ver, depth=2, exception=None, log_callback=None, *args, **kwargs)¶ Log deprecation message, throw error if current version is passed given threshold.
Checks only major/minor version numbers (MAJ.MIN.x) by default, controlled by ‘depth’ argument.
-
fail
(message, *args)¶ Log error message and raise exception.
-
get_parent_info
(prefix, verbose=True)¶ Return pretty text version
-
log_method
(msg)¶
-
makeRecord
(name, level, pathname, lineno, msg, args, excinfo, func=None, extra=None, sinfo=None)¶ overwrite make record to use a fancy record (with more options)
-
raiseException
(message, exception=None, catch=False)¶ logs message and raises an exception (since it can be caught higher up and handled) and raises it afterwards :param exception: subclass of Exception to use for raising :param catch: boolean, try to catch raised exception and add relevant info to message
(this will also happen if exception is not specified)
-
setLevelName
(level_name)¶ Set the level by name.
-
streamDebug
(data)¶ Get a DEBUG loglevel streamLog
-
streamError
(data)¶ Get a ERROR loglevel streamLog
-
streamInfo
(data)¶ Get a INFO loglevel streamLog
-
streamLog
(levelno, data)¶ Add (continuous) data to an existing message stream (eg a stream after a logging.info()
-
-
class
easybuild.base.fancylogger.
FancyStreamHandler
(stream=None, stdout=None)¶ Bases:
logging.StreamHandler
The logging StreamHandler with uniform named arg in __init__ for selecting the stream.
-
exception
easybuild.base.fancylogger.
MissingLevelName
¶ Bases:
KeyError
-
easybuild.base.fancylogger.
disableDefaultHandlers
()¶ Disable the default handlers on all fancyloggers - if this is the last logger, it will just set the logLevel very high
-
easybuild.base.fancylogger.
enableDefaultHandlers
()¶ (re)Enable the default handlers on all fancyloggers
-
easybuild.base.fancylogger.
getAllExistingLoggers
()¶ Returns: the existing loggers, in a list of C{(name, logger)} tuples
-
easybuild.base.fancylogger.
getAllFancyloggers
()¶ Return all loggers that are not fancyloggers
-
easybuild.base.fancylogger.
getAllNonFancyloggers
()¶ Returns: all loggers that are not fancyloggers
-
easybuild.base.fancylogger.
getDetailsLogLevels
(fancy=True, numeric=False)¶ Return list of (name,loglevelname) pairs of existing loggers
Parameters: - fancy – if True, returns only Fancylogger; if False, returns non-FancyLoggers, anything else, return all loggers
- numeric – if True, return the numeric value instead of the name
-
easybuild.base.fancylogger.
getLevelInt
(level_name)¶ Given a level name, return the int value
-
easybuild.base.fancylogger.
getLogger
(name=None, fname=False, clsname=False, fancyrecord=None)¶ Returns a Fancylogger instance if fname is True, the loggers name will be ‘name[.classname].functionname’ if clsname is True the loggers name will be ‘name.classname[.functionname]’
This will return a logger with a fancylog record, which includes the className template for the logformat This can make your code a lot slower, so this can be disabled by setting fancyrecord or class module FANCYLOG_FANCYRECORD to False, or will also be disabled if a Name is set (and fancyrecord and module constant FANCYLOG_FANCYRECORD are also not set).
-
easybuild.base.fancylogger.
getRootLoggerName
()¶ returns the name of the root module this is the module that is actually running everything and so doing the logging
-
easybuild.base.fancylogger.
is_fancyroot
()¶ Return if the logging.root logger is a FancyLogger
-
easybuild.base.fancylogger.
logToDevLog
(enable=True, name=None, handler=None)¶ Log to syslog through /dev/log
-
easybuild.base.fancylogger.
logToFile
(filename, enable=True, filehandler=None, name=None, max_bytes=104857600, backup_count=10)¶ enable (or disable) logging to file given filename will log to a file with the given name using a rotatingfilehandler this will let the file grow to MAX_BYTES and then rotate it saving the last BACKUPCOUNT files.
returns the filehandler (this can be used to later disable logging to file)
if you want to disable logging to file, pass the earlier obtained filehandler
-
easybuild.base.fancylogger.
logToScreen
(enable=True, handler=None, name=None, stdout=False, colorize='never')¶ enable (or disable) logging to screen returns the screenhandler (this can be used to later disable logging to screen)
if you want to disable logging to screen, pass the earlier obtained screenhandler
you can also pass the name of the logger for which to log to the screen otherwise you’ll get all logs on the screen
by default, logToScreen will log to stderr; logging to stdout instead can be done by setting the ‘stdout’ parameter to True
The colorize parameter enables or disables log colorization using ANSI terminal escape sequences, according to the values allowed in the colorize parameter to function _screenLogFormatterFactory (which see).
-
easybuild.base.fancylogger.
logToUDP
(hostname, port=5005, enable=True, datagramhandler=None, name=None)¶ enable (or disable) logging to udp given hostname and port.
returns the filehandler (this can be used to later disable logging to udp)
if you want to disable logging to udp, pass the earlier obtained filehandler, and set boolean = False
-
easybuild.base.fancylogger.
resetroot
()¶ Restore the original logging.root logger
-
easybuild.base.fancylogger.
setLogFormat
(f_format)¶ Set the log format. (Has to be set before logToSomething is called).
-
easybuild.base.fancylogger.
setLogLevel
(level)¶ Set a global log level for all FancyLoggers
-
easybuild.base.fancylogger.
setLogLevelDebug
()¶ shorthand for setting debug level
-
easybuild.base.fancylogger.
setLogLevelError
()¶ shorthand for setting loglevel to Error
-
easybuild.base.fancylogger.
setLogLevelInfo
()¶ shorthand for setting loglevel to Info
-
easybuild.base.fancylogger.
setLogLevelWarning
()¶ shorthand for setting loglevel to Warning
-
easybuild.base.fancylogger.
setTestLogFormat
()¶ Set the log format to the test format (i.e. without timestamp).
-
easybuild.base.fancylogger.
setroot
(fancyrecord=None)¶ Set a FancyLogger instance as the logging root logger with (effective)loglevel of current root FancyLogger
:param fancyrecord is enabled or not (default FANCYLOG_FANCYRECORD module constant)
Detecting the loglevel is best-effort, better to set the loglevel after setroot()
-
easybuild.base.fancylogger.
thread_name
()¶ returns the current threads name