logger.Formatter to simplify setting formatting for multiple logging levels
Project description
MultiLevelFormatter
MultiLevelFormatter
is a Python logging.Formatter
that simplifies setting log formats for different log levels. Log records with level logging.ERROR
or higher are printed to STDERR if using defaults with MultilevelFormatter.setDefaults()
.
Importing MultiLevelFormatter
adds MESSAGE level (25
) to logging and an logging.message()
method. The idea is that you can use logging.message()
instead of print()
and use logging levels to control verbosity. See the full example below.
Install
Python 3.11 or later is required.
pip install multilevelformatter
Usage
Please note. If you use mypy
, you need to add # type: ignore
to the lines assigning logging.message
to message
(function) and whenever using logging.MESSAGE
log level name. In practice this will be few lines in a module. mypy
does not recognize the modifications to the logging
class that is done when importing multilevelformatter
. See mypy#5363 for details.
logger = logging.getLogger(__name__)
error = logger.error
warning = logger.warning
# added when importing multilevelformatter
message = logging.message # type: ignore
verbose = logger.info
debug = logger.debug
# Not complete, does not run
def main() -> None:
...
# assumes command line arguments have been parsed into
# boolean flags: arg_verbose, arg_debug, arg_silent
# MultiLevelFormatter adds MESSAGE level (25) to logging
LOG_LEVEL: int = logging.MESSAGE # type: ignore
if arg_verbose:
LOG_LEVEL = logging.INFO
elif arg_warning:
LOG_LEVEL = logging.WARNING
elif arg_debug:
LOG_LEVEL = logging.DEBUG
elif arg_silent:
LOG_LEVEL = logging.ERROR
MultilevelFormatter.setDefaults(logger, log_file=log)
logger.setLevel(LOG_LEVEL)
...
Example
Full runnable example below. It can be found in demos/ folder.
import logging
from typer import Typer, Option
from typing import Annotated, Optional
from pathlib import Path
from multilevelformatter import MultilevelFormatter
logger = logging.getLogger(__name__)
error = logger.error
# MultiLevelFormatter adds MESSAGE level and message() to logging
message = logger.message # type: ignore
verbose = logger.info
debug = logger.debug
# the demo uses typer for CLI parsing.
# Typer has nothing to do with MultiLevelFormatter
app = Typer()
@app.callback(invoke_without_command=True)
def cli(
print_verbose: Annotated[
bool,
Option(
"--verbose",
"-v",
show_default=False,
help="verbose logging",
),
] = False,
print_debug: Annotated[
bool,
Option(
"--debug",
show_default=False,
help="debug logging",
),
] = False,
print_silent: Annotated[
bool,
Option(
"--silent",
show_default=False,
help="silent logging",
),
] = False,
log: Annotated[Optional[Path], Option(help="log to FILE", metavar="FILE")] = None,
) -> None:
"""MultilevelFormatter demo"""
global logger
try:
LOG_LEVEL: int = logging.MESSAGE # type: ignore
if print_verbose:
LOG_LEVEL = logging.INFO
elif print_debug:
LOG_LEVEL = logging.DEBUG
elif print_silent:
LOG_LEVEL = logging.ERROR
MultilevelFormatter.setDefaults(logger, log_file=log)
logger.setLevel(LOG_LEVEL)
except Exception as err:
error(f"{err}")
message("standard")
verbose("verbose")
error("error")
debug("debug")
if __name__ == "__main__":
app()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for multilevelformatter-0.3.5.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7c7f283e258abfc4665e7902fe2f1ac88b5894bdf54162cba12916c85aadbb5a |
|
MD5 | 093e90a261c7e170442de8a29b6fc16a |
|
BLAKE2b-256 | 23f740ba2d0357d19952ea2fb7dba0b0ce01f5520315062cd1ecad424145da24 |
Hashes for multilevelformatter-0.3.5-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | deed00fbdeb343e4610ca49ed0b7af75b087453601ff144c0022280736d72e9c |
|
MD5 | b1914aa55cc2dd53d49d970ca046a244 |
|
BLAKE2b-256 | 12e39cd443016646cdb955f1e9d346cf37f43ef2133409a87bc3c8bd23ce920f |