Diff of /catenets/logger.py [000000] .. [6ac965]

Switch to unified view

a b/catenets/logger.py
1
# stdlib
2
import logging
3
import os
4
from typing import Any, Callable, NoReturn, TextIO, Union
5
6
# third party
7
from loguru import logger
8
9
LOG_FORMAT = "[{time}][{process.id}][{level}] {message}"
10
11
logger.remove()
12
DEFAULT_SINK = "catenets_{time}.log"
13
14
15
def remove() -> None:
16
    logger.remove()
17
18
19
def add(
20
    sink: Union[None, str, os.PathLike, TextIO, logging.Handler] = None,
21
    level: str = "ERROR",
22
) -> None:
23
    sink = DEFAULT_SINK if sink is None else sink
24
    try:
25
        logger.add(
26
            sink=sink,
27
            format=LOG_FORMAT,
28
            enqueue=True,
29
            colorize=False,
30
            diagnose=True,
31
            backtrace=True,
32
            rotation="10 MB",
33
            retention="1 day",
34
            level=level,
35
        )
36
    except BaseException:
37
        logger.add(
38
            sink=sink,
39
            format=LOG_FORMAT,
40
            colorize=False,
41
            diagnose=True,
42
            backtrace=True,
43
            level=level,
44
        )
45
46
47
def traceback_and_raise(e: Any, verbose: bool = False) -> NoReturn:
48
    try:
49
        if verbose:
50
            logger.opt(lazy=True).exception(e)
51
        else:
52
            logger.opt(lazy=True).critical(e)
53
    except BaseException as ex:
54
        logger.debug("failed to print exception", ex)
55
    if not issubclass(type(e), Exception):
56
        e = Exception(e)
57
    raise e
58
59
60
def create_log_and_print_function(level: str) -> Callable:
61
    def log_and_print(*args: Any, **kwargs: Any) -> None:
62
        try:
63
            method = getattr(logger.opt(lazy=True), level, None)
64
            if method is not None:
65
                method(*args, **kwargs)
66
            else:
67
                logger.debug(*args, **kwargs)
68
        except BaseException as e:
69
            msg = f"failed to log exception. {e}"
70
            try:
71
                logger.debug(msg)
72
            except Exception as e:
73
                print(f"{msg}. {e}")
74
75
    return log_and_print
76
77
78
def traceback(*args: Any, **kwargs: Any) -> None:
79
    return create_log_and_print_function(level="exception")(*args, **kwargs)
80
81
82
def critical(*args: Any, **kwargs: Any) -> None:
83
    return create_log_and_print_function(level="critical")(*args, **kwargs)
84
85
86
def error(*args: Any, **kwargs: Any) -> None:
87
    return create_log_and_print_function(level="error")(*args, **kwargs)
88
89
90
def warning(*args: Any, **kwargs: Any) -> None:
91
    return create_log_and_print_function(level="warning")(*args, **kwargs)
92
93
94
def info(*args: Any, **kwargs: Any) -> None:
95
    return create_log_and_print_function(level="info")(*args, **kwargs)
96
97
98
def debug(*args: Any, **kwargs: Any) -> None:
99
    return create_log_and_print_function(level="debug")(*args, **kwargs)
100
101
102
def trace(*args: Any, **kwargs: Any) -> None:
103
    return create_log_and_print_function(level="trace")(*args, **kwargs)