File size: 2,418 Bytes
626eca0 |
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 |
import logging
import sys
import threading
from typing import Optional
from rich import get_console
_lock = threading.Lock()
_default_handler: Optional[logging.Handler] = None
_default_log_level = logging.WARNING
# fancy logger
_console = get_console()
def _get_library_name() -> str:
return __name__.split(".")[0]
def _get_library_root_logger() -> logging.Logger:
return logging.getLogger(_get_library_name())
def _configure_library_root_logger() -> None:
global _default_handler
with _lock:
if _default_handler:
# This library has already configured the library root logger.
return
_default_handler = logging.StreamHandler() # Set sys.stderr as stream.
_default_handler.flush = sys.stderr.flush
# Apply our default configuration to the library root logger.
library_root_logger = _get_library_root_logger()
library_root_logger.addHandler(_default_handler)
library_root_logger.setLevel(_default_log_level)
library_root_logger.propagate = False
def _reset_library_root_logger() -> None:
global _default_handler
with _lock:
if not _default_handler:
return
library_root_logger = _get_library_root_logger()
library_root_logger.removeHandler(_default_handler)
library_root_logger.setLevel(logging.NOTSET)
_default_handler = None
def set_log_level(level: int, logger: logging.Logger = None) -> None:
"""
Set the log level.
Args:
level (:obj:`int`):
Logging level.
logger (:obj:`logging.Logger`):
Logger to set the log level.
"""
if not logger:
_configure_library_root_logger()
logger = _get_library_root_logger()
logger.setLevel(level)
def get_logger(
name: Optional[str] = None,
level: Optional[int] = None,
formatter: Optional[str] = None,
) -> logging.Logger:
"""
Return a logger with the specified name.
"""
if name is None:
name = _get_library_name()
_configure_library_root_logger()
if level is not None:
set_log_level(level)
if formatter is None:
formatter = logging.Formatter(
"%(asctime)s - %(levelname)s - %(name)s - %(message)s"
)
_default_handler.setFormatter(formatter)
return logging.getLogger(name)
def get_console_logger():
return _console
|