Skip to content

zimscraperlib.logging

Functions:

  • getLogger

    configured logger for most usages

  • nicer_args_join

    slightly better concateated list of subprocess args for display

Attributes:

DEFAULT_FORMAT module-attribute

DEFAULT_FORMAT = (
    "[%(name)s::%(asctime)s] %(levelname)s:%(message)s"
)

DEFAULT_FORMAT_WITH_THREADS module-attribute

DEFAULT_FORMAT_WITH_THREADS = "[%(name)s::%(threadName)s::%(asctime)s] %(levelname)s:%(message)s"

VERBOSE_DEPENDENCIES module-attribute

VERBOSE_DEPENDENCIES = [
    "urllib3",
    "PIL",
    "boto3",
    "botocore",
    "s3transfer",
]

getLogger

getLogger(
    name: str,
    level: int = INFO,
    console: TextIO | StringIO | None = stdout,
    log_format: str | None = DEFAULT_FORMAT,
    file: Path | None = None,
    file_level: int | None = None,
    file_format: str | None = None,
    file_max: int = 2**20,
    file_nb_backup: int = 1,
    deps_level: int = WARNING,
    additional_deps: Iterable[str] | None = None,
)

configured logger for most usages

  • name: name of your logger
  • level: console level
  • log_format: format string
  • console: False | True (sys.stdout) | sys.stdout | sys.stderr
  • file: False | pathlib.Path
  • file_level: log level for file or console_level
  • file_format: format string for file or log_format
  • deps_level: log level for idendified verbose dependencies
  • additional_deps: additional modules names of verbose dependencies to assign deps_level to
Source code in src/zimscraperlib/logging.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
def getLogger(  # noqa: N802 (intentionally matches the stdlib getLogger name)
    name: str,
    level: int = logging.INFO,
    console: TextIO | io.StringIO | None = sys.stdout,
    log_format: str | None = DEFAULT_FORMAT,
    file: pathlib.Path | None = None,
    file_level: int | None = None,
    file_format: str | None = None,
    file_max: int = 2**20,
    file_nb_backup: int = 1,
    deps_level: int = logging.WARNING,
    additional_deps: Iterable[str] | None = None,
):
    """configured logger for most usages

    - name: name of your logger
    - level: console level
    - log_format: format string
    - console: False | True (sys.stdout) | sys.stdout | sys.stderr
    - file: False | pathlib.Path
    - file_level: log level for file or console_level
    - file_format: format string for file or log_format
    - deps_level: log level for idendified verbose dependencies
    - additional_deps: additional modules names of verbose dependencies
        to assign deps_level to"""

    if not additional_deps:
        additional_deps = []

    # align zimscraperlib logging level to that of scraper
    logging.Logger(NAME).setLevel(level)

    # set arbitrary level for some known verbose dependencies
    # prevents them from polluting logs
    for logger_name in set(VERBOSE_DEPENDENCIES + list(additional_deps)):
        logging.getLogger(logger_name).setLevel(deps_level)

    logger = logging.Logger(name)
    logger.setLevel(logging.DEBUG)

    # setup console logging
    if console:
        console_handler = logging.StreamHandler(console)
        console_handler.setFormatter(logging.Formatter(log_format))
        console_handler.setLevel(level)
        logger.addHandler(console_handler)

    if file:
        file_handler = RotatingFileHandler(
            file,
            maxBytes=file_max,
            backupCount=file_nb_backup,
        )
        file_handler.setFormatter(logging.Formatter(file_format or log_format))
        file_handler.setLevel(file_level or level)
        logger.addHandler(file_handler)

    return logger

nicer_args_join

nicer_args_join(args: list[str]) -> str

slightly better concateated list of subprocess args for display

Source code in src/zimscraperlib/logging.py
78
79
80
81
82
83
def nicer_args_join(args: list[str]) -> str:
    """slightly better concateated list of subprocess args for display"""
    nargs = args[0:1]
    for arg in args[1:]:
        nargs.append(arg if arg.startswith("-") else f'"{arg}"')
    return " ".join(nargs)