1a8e1175bSopenharmony_ci"""Auxiliary functions used for logging module.
2a8e1175bSopenharmony_ci"""
3a8e1175bSopenharmony_ci
4a8e1175bSopenharmony_ci# Copyright The Mbed TLS Contributors
5a8e1175bSopenharmony_ci# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6a8e1175bSopenharmony_ci#
7a8e1175bSopenharmony_ci
8a8e1175bSopenharmony_ciimport logging
9a8e1175bSopenharmony_ciimport sys
10a8e1175bSopenharmony_ci
11a8e1175bSopenharmony_cidef configure_logger(
12a8e1175bSopenharmony_ci        logger: logging.Logger,
13a8e1175bSopenharmony_ci        log_format="[%(levelname)s]: %(message)s",
14a8e1175bSopenharmony_ci        split_level=logging.WARNING
15a8e1175bSopenharmony_ci    ) -> None:
16a8e1175bSopenharmony_ci    """
17a8e1175bSopenharmony_ci    Configure the logging.Logger instance so that:
18a8e1175bSopenharmony_ci        - Format is set to any log_format.
19a8e1175bSopenharmony_ci            Default: "[%(levelname)s]: %(message)s"
20a8e1175bSopenharmony_ci        - loglevel >= split_level are printed to stderr.
21a8e1175bSopenharmony_ci        - loglevel <  split_level are printed to stdout.
22a8e1175bSopenharmony_ci            Default: logging.WARNING
23a8e1175bSopenharmony_ci    """
24a8e1175bSopenharmony_ci    class MaxLevelFilter(logging.Filter):
25a8e1175bSopenharmony_ci        # pylint: disable=too-few-public-methods
26a8e1175bSopenharmony_ci        def __init__(self, max_level, name=''):
27a8e1175bSopenharmony_ci            super().__init__(name)
28a8e1175bSopenharmony_ci            self.max_level = max_level
29a8e1175bSopenharmony_ci
30a8e1175bSopenharmony_ci        def filter(self, record: logging.LogRecord) -> bool:
31a8e1175bSopenharmony_ci            return record.levelno <= self.max_level
32a8e1175bSopenharmony_ci
33a8e1175bSopenharmony_ci    log_formatter = logging.Formatter(log_format)
34a8e1175bSopenharmony_ci
35a8e1175bSopenharmony_ci    # set loglevel >= split_level to be printed to stderr
36a8e1175bSopenharmony_ci    stderr_hdlr = logging.StreamHandler(sys.stderr)
37a8e1175bSopenharmony_ci    stderr_hdlr.setLevel(split_level)
38a8e1175bSopenharmony_ci    stderr_hdlr.setFormatter(log_formatter)
39a8e1175bSopenharmony_ci
40a8e1175bSopenharmony_ci    # set loglevel < split_level to be printed to stdout
41a8e1175bSopenharmony_ci    stdout_hdlr = logging.StreamHandler(sys.stdout)
42a8e1175bSopenharmony_ci    stdout_hdlr.addFilter(MaxLevelFilter(split_level - 1))
43a8e1175bSopenharmony_ci    stdout_hdlr.setFormatter(log_formatter)
44a8e1175bSopenharmony_ci
45a8e1175bSopenharmony_ci    logger.addHandler(stderr_hdlr)
46a8e1175bSopenharmony_ci    logger.addHandler(stdout_hdlr)
47