File size: 1,287 Bytes
c20d7cc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Contains logging related utility functions.

For licensing see accompanying LICENSE file.
Copyright (C) 2025 Apple Inc. All Rights Reserved.
"""

from __future__ import annotations

import logging
import sys
from pathlib import Path


def configure(log_level: int, log_path: Path | None = None, prefix: str | None = None) -> None:
    """Configure logger globally.

    Args:
        log_level: The desired verbosity level.
        log_path: The path to write logs to.
        prefix: The prefix of the logger.
    """
    logger = logging.getLogger(prefix)

    # Reset logger to initial state (e.g. to avoid side effects from imports).
    for handler in logger.handlers:
        logger.removeHandler(handler)

    for filter in logger.filters:
        logger.removeFilter(filter)

    # Set level.
    logger.setLevel(log_level)

    formatter = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")

    # Set up console handler.
    stdout_handler = logging.StreamHandler(sys.stdout)
    stdout_handler.setFormatter(formatter)
    logger.addHandler(stdout_handler)

    # Set up file handler.
    if log_path is not None:
        file_handler = logging.FileHandler(log_path, mode="w")
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)