dlpt.log module
Common wrappers and helper functions to simplify most common use cases of builtin ‘logging’ module.
- Create logger and (optionally) set it as a default dlpt logger.
- Note:
‘Default’ logger means that (once initialized), any dlpt log functions, such as
info()
andwarning()
will log to this default logger. Once initialized as default logger, any other file can simply use dlpt log functions without setting up logger.- Example:
>>> #file1.py >>> logger = dlpt.log.create_logger("my_logger") >>> dlpt.log.add_file_hdlr(logger, "dlpt_example.log") >>> dlpt.log.info("Log from file1.") >>> >>> #file2.py >>> dlpt.log.info("Log from file2.")
- Use dlpt.log.add_*() functions to add common handlers to any
logging.Logger
instance: console (terminal) handler, file handler, rotating file handler, server socket handler (for logs when multiple processes are used).
## Logging server
To unify logs from multiple processes, user can create logging server via
function create_log_server_proc()
. This process will create a custom
logger with file handler and open a socket connection on a designated port.
Any logger (from any process) that has configured logging server handler (via
add_logging_server_hdlr()
) will push logs to this logging server and
therefore to a shared log file.
Note that log statements order might not be exactly the same as this is OS-dependant.
- dlpt.log.create_logger(name: str | None = None, set_as_default: bool = True, level: int | None = 10) Logger
Create new logger instance with the given ‘name’ and optionally set it as a default logger whenever dlpt.log.* log functions are invoked.
- Parameters:
name – Optional name of the new logger instance or root by default.
set_as_default – If True, created logger instance will be set as a default logger whenewer dlpt.log.* log functions are invoked.
level – log level for this specific logger. If None, everything is logged (
logging.DEBUG
level).
- dlpt.log.add_console_hdlr(logger: Logger | str, fmt: Formatter | None = None, level: int = 10) StreamHandler
Add console handler to logger instance.
Note
Create custom formatter with:
logging.Formatter(<formatter>, datefmt=<time formatter>)
- Parameters:
logger – logger instance or logger name.
fmt – Optional custom formatter for created handler. By default, DEFAULT_FORMATTER and DEFAULT_FORMATTER_TIME is used.
level – set log level for this specific handler. By default, everything is logged (
DEBUG
level).
- Returns:
Created console (stream) handler object.
- dlpt.log.add_file_hdlr(logger: Logger | str, file_name: str | None = None, dir_path: str | None = None, fmt: Formatter | None = None, level: int = 10, mode: str = 'w') Tuple[FileHandler, str]
Add file handler to logger instance.
- Parameters:
logger – logger instance or logger name.
file_name – name of a log file. If there is no file extension, default
DEFAULT_LOG_FILE_EXT
is appended. IfNone
, logger name is used as a file name.dir_path – path to a directory where logs will be stored. If
None
, path is fetched withget_default_log_dir()
.If log directory does not exist, it is created.fmt – Optional custom formatter for created handler. By default, DEFAULT_FORMATTER and DEFAULT_FORMATTER_TIME is used.
level – Log level for this specific handler. By default, everything is logged (
DEBUG
level).mode – file open mode (“w”, “a”, … See logging docs.).
- Returns:
(created file handler, file path).
- Return type:
A tuple
- dlpt.log.add_rotating_file_hdlr(logger: Logger | str, file_name: str | None = None, dir_path: str | None = None, fmt: Formatter | None = None, level: int = 10, max_size_kb: int = 100, backup_count: int = 1) Tuple[RotatingFileHandler, str]
Add rotating file handler to logger instance.
- Parameters:
logger – logger instance or logger name.
file_name – name of a log file. If there is no file extension, default
DEFAULT_LOG_FILE_EXT
is appended. IfNone
, logger name is used as a file name.dir_path – path to a directory where logs will be stored. If
None
, path is fetched withget_default_log_dir()
. If log directory does not exist, it is created.max_size_kb – number of KB at which rollover is performed on a current log file.
backup_count – number of files to store (if file with given name already exists).
fmt – Optional custom formatter for created handler. By default, DEFAULT_FORMATTER and DEFAULT_FORMATTER_TIME is used.
level – Log level for this specific handler. By default, everything is logged (
DEBUG
level).
- Returns:
(created rotating file handler, file path).
- Return type:
A tuple
- dlpt.log.add_logging_server_hdlr(logger: Logger | str, port: int = 9020, fmt: Formatter | None = None, level: int = 10) _SocketHandler
Add log socket handler to this logger instance. This function assume that log socket server is already initialized.
- Parameters:
logger – logger instance or logger name.
port – socket port where logger writes data to.
fmt – Optional custom formatter for created handler. By default,
DEFAULT_FORMATTER
andDEFAULT_FORMATTER_TIME
is used.level – Log level for this specific handler. By default, everything is logged (
DEBUG
level).
- dlpt.log.get_log_file_paths(logger: Logger | str) List[str]
Return log file paths of logging.FileHandler(s) of a given logger instance.
- Parameters:
logger – logger instance or logger name.
- Returns:
List of loggers file handlers file paths.
- dlpt.log.get_rotating_log_file_paths(logger: Logger | str) List[str]
Return log file paths of logging.RotatingFileHandler(s) of a given logger instance.
- Parameters:
logger – logger instance or logger name.
- Returns:
List of loggers rotating file handlers file paths.
- dlpt.log.get_default_logger() Logger | None
Get default logger instance object (if set).
- Returns:
Current logger instance when dlpt.log.* log functions are invoked.
- dlpt.log.set_default_logger(logger: Logger)
Set default logger instance.
- Parameters:
logger – logger instance or logger name.
- Returns:
Current logger instance object.
- dlpt.log.get_file_name(logger: Logger | str, file_name: str | None = None) str
Determine log file name, based on a current logger name or given file_name.
- Parameters:
logger – logger instance or logger name.
file_name – if given, this name is checked (for extension) or default file name is created from logger name.
- Returns:
File name with extension.
- dlpt.log.get_default_log_dir() str
Get default log directory path: <cwd>/DEFAULT_LOG_DIR_NAME.
- Returns:
Path to a directory where logs are usually created.
- class dlpt.log.ReleaseFileLock(logger: Logger | str, file_path: str)
Bases:
object
- __init__(logger: Logger | str, file_path: str)
Temporary release file handler of logging file streams to be able to copy file (for example, log file is locked by logger on Windows.) Use as a context manager.
- Parameters:
logger – logger instance or logger name.
file_path – logging file path
Example
>>> with dlpt.log.ReleaseFileLock(logger, file_path): >>> shutil.move(file_path, tmp_path)
- class dlpt.log.LoggingServer(port: int = 9020)
Bases:
ThreadingTCPServer
Simple TCP socket-based logging server (receiver). All messages are pickled at client TX side and un-pickled here. Any received message is than further handled by
handleLogRecord()
.Sets Allow address reuse.
- allow_reuse_address = True
- daemon_threads = True
- __init__(port: int = 9020)
Init log socket server. By default, this server logs all received messages to a root logger as configured.
Note
Use
add_logging_server_hdlr()
function to add socket handler to any logger instance and logs will be automatically pushed to the createdLoggingServer
process. Note that ports must be properly configured for logging to work.- Parameters:
port – port where socket server reads data from.
- handle_error(request, client_address)
Handle an error gracefully. May be overridden.
The default is to print a traceback and continue.
- dlpt.log.create_log_server_proc(file_path: str, port: int = 9020) int
Create socket server logger subprocess that logs all received messages on a given
port
socket to a log file handler.- Parameters:
file_path – absolute path to a log file, including extension.
port – port where socket server will listen.
Note
port number must be unique - this means that the default
create_log_server_proc()
can be called only once. Further socket servers (of any process) and logger handlers must set ports manually.- Returns:
PID of created socket server subprocess.
- dlpt.log.log_server_shutdown_request(logger: Logger | str, pid: int, timeout_sec: int = 3) bool
Send ‘unique’ log message that indicates to server to perform shutdown - close all connections and finish process.
- Parameters:
logger – logger instance or logger name. Note that logging server handler must be available in this logger.
pid – logging server PID.
timeout_sec – time to wait until logging server PID is checked for status. In case of 0, function return value is not relevant.
- Returns:
True if server was successfully stopped (PID not alive anymore), False otherwise.
- dlpt.log.debug(msg: str, logger: Logger | str | None = None, *args, **kwargs)
Log to a given or default logger (if available) with ‘DEBUG’ level.
- Parameters:
msg – message to log.
logger – logger instance or logger name. If not set, default logger is used (as set by
create_logger()
).
- dlpt.log.info(msg: str, logger: Logger | str | None = None, *args, **kwargs)
Log to a given or default logger (if available) with ‘INFO’ level.
- Parameters:
msg – message to log.
logger – logger instance or logger name. If not set, default logger is used (as set by
create_logger()
).
- dlpt.log.warning(msg: str, logger: Logger | str | None = None, *args, **kwargs)
Log to a given or default logger (if available) with ‘WARNING’ level.
- Parameters:
msg – message to log.
logger – logger instance or logger name. If not set, default logger is used (as set by
create_logger()
).
- dlpt.log.warning_with_traceback(msg: str, logger: Logger | str | None = None, *args, **kwargs)
Log to a given or default logger (if available) with ‘WARNING’ level and append exception info traceback at the end (if available).
- Parameters:
msg – message to log.
logger – logger instance or logger name. If not set, default logger is used (as set by
create_logger()
).
- dlpt.log.error(msg: str, logger: Logger | str | None = None, *args, **kwargs)
Log to a given or default logger (if available) with ‘ERROR’ level.
- Parameters:
msg – message to log.
logger – logger instance or logger name. If not set, default logger is used (as set by
create_logger()
).
- dlpt.log.error_with_traceback(msg: str, logger: Logger | str | None = None, *args, **kwargs)
Log to a given or default logger (if available) with ‘ERROR’ level and append exception info traceback at the end (if available).
- Parameters:
msg – message to log.
logger – logger instance or logger name. If not set, default logger is used (as set by
create_logger()
).
- dlpt.log.critical(msg: str, logger: Logger | str | None = None, *args, **kwargs)
Log to a given or default logger (if available) with ‘CRITICAL’ level.
- Parameters:
msg – message to log.
logger – logger instance or logger name. If not set, default logger is used (as set by
create_logger()
).
- dlpt.log.critical_with_traceback(msg: str, logger: Logger | str | None = None, *args, **kwargs)
Log to a given or default logger (if available) with ‘CRITICAL’ level and append exception info traceback at the end (if available).
- Parameters:
msg – message to log.
logger – logger instance or logger name. If not set, default logger is used (as set by
create_logger()
).