aboutsummaryrefslogtreecommitdiff
path: root/src/mlia/cli/logging.py
blob: c5fc7bd53ad961152502316f54f4dac046cfb496 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# SPDX-FileCopyrightText: Copyright 2022, Arm Limited and/or its affiliates.
# SPDX-License-Identifier: Apache-2.0
"""CLI logging configuration."""
import logging
import sys
from pathlib import Path
from typing import List
from typing import Optional
from typing import Union

from mlia.utils.logging import attach_handlers
from mlia.utils.logging import create_log_handler
from mlia.utils.logging import LogFilter


_CONSOLE_DEBUG_FORMAT = "%(name)s - %(message)s"
_FILE_DEBUG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"


def setup_logging(
    logs_dir: Optional[Union[str, Path]] = None,
    verbose: bool = False,
    log_filename: str = "mlia.log",
) -> None:
    """Set up logging.

    MLIA uses module 'logging' when it needs to produce output.

    :param logs_dir: path to the directory where application will save logs with
           debug information. If the path is not provided then no log files will
           be created during execution
    :param verbose: enable extended logging for the tools loggers
    :param log_filename: name of the log file in the logs directory
    """
    mlia_logger, *tools_loggers = [
        logging.getLogger(logger_name)
        for logger_name in ["mlia", "tensorflow", "py.warnings"]
    ]

    # enable debug output, actual message filtering depends on
    # the provided parameters and being done on the handlers level
    mlia_logger.setLevel(logging.DEBUG)

    mlia_handlers = _get_mlia_handlers(logs_dir, log_filename, verbose)
    attach_handlers(mlia_handlers, [mlia_logger])

    tools_handlers = _get_tools_handlers(logs_dir, log_filename, verbose)
    attach_handlers(tools_handlers, tools_loggers)


def _get_mlia_handlers(
    logs_dir: Optional[Union[str, Path]],
    log_filename: str,
    verbose: bool,
) -> List[logging.Handler]:
    """Get handlers for the MLIA loggers."""
    result = []
    stdout_handler = create_log_handler(
        stream=sys.stdout,
        log_level=logging.INFO,
    )
    result.append(stdout_handler)

    if verbose:
        mlia_verbose_handler = create_log_handler(
            stream=sys.stdout,
            log_level=logging.DEBUG,
            log_format=_CONSOLE_DEBUG_FORMAT,
            log_filter=LogFilter.equals(logging.DEBUG),
        )
        result.append(mlia_verbose_handler)

    if logs_dir:
        mlia_file_handler = create_log_handler(
            file_path=_get_log_file(logs_dir, log_filename),
            log_level=logging.DEBUG,
            log_format=_FILE_DEBUG_FORMAT,
            log_filter=LogFilter.skip(logging.INFO),
            delay=True,
        )
        result.append(mlia_file_handler)

    return result


def _get_tools_handlers(
    logs_dir: Optional[Union[str, Path]],
    log_filename: str,
    verbose: bool,
) -> List[logging.Handler]:
    """Get handler for the tools loggers."""
    result = []
    if verbose:
        verbose_stdout_handler = create_log_handler(
            stream=sys.stdout,
            log_level=logging.DEBUG,
            log_format=_CONSOLE_DEBUG_FORMAT,
        )
        result.append(verbose_stdout_handler)

    if logs_dir:
        file_handler = create_log_handler(
            file_path=_get_log_file(logs_dir, log_filename),
            log_level=logging.DEBUG,
            log_format=_FILE_DEBUG_FORMAT,
            delay=True,
        )
        result.append(file_handler)

    return result


def _get_log_file(logs_dir: Union[str, Path], log_filename: str) -> Path:
    """Get the log file path."""
    logs_dir_path = Path(logs_dir)
    logs_dir_path.mkdir(exist_ok=True)
    return logs_dir_path / log_filename