add logging, related to #8
This commit is contained in:
67
src/dopt_basics/logging.py
Normal file
67
src/dopt_basics/logging.py
Normal file
@@ -0,0 +1,67 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import logging.handlers
|
||||
from pathlib import Path
|
||||
from time import gmtime
|
||||
from typing import Final
|
||||
|
||||
# ** config
|
||||
LOG_FILENAME: Final[str] = "dopt.log"
|
||||
BASE_NAME: Final[str] = "dopt_base"
|
||||
|
||||
LOG_FMT: Final[str] = "%(asctime)s | lang_main:%(module)s:%(levelname)s | %(message)s"
|
||||
LOG_DATE_FMT: Final[str] = "%Y-%m-%d %H:%M:%S +0000"
|
||||
DEFAULT_LOGLEVEL_STDERR: Final[int] = logging.DEBUG
|
||||
DEFAULT_LOGLEVEL_FILE: Final[int] = logging.DEBUG
|
||||
# ** handlers
|
||||
NULL_HANDLER = logging.NullHandler()
|
||||
|
||||
# ** loggers and configuration
|
||||
BASE_LOGGER = logging.getLogger("dopt_base")
|
||||
|
||||
|
||||
def setup_logging(
|
||||
enable_stderr: bool,
|
||||
enable_file: bool = False,
|
||||
logging_dir: Path | None = None,
|
||||
log_filename: str = LOG_FILENAME,
|
||||
) -> None:
|
||||
# ** formatters
|
||||
logging.Formatter.converter = gmtime
|
||||
LOGGER_ALL_FORMATER = logging.Formatter(fmt=LOG_FMT, datefmt=LOG_DATE_FMT)
|
||||
# ** handlers
|
||||
if enable_stderr:
|
||||
logger_all_handler_stderr = logging.StreamHandler()
|
||||
logger_all_handler_stderr.setLevel(DEFAULT_LOGLEVEL_STDERR)
|
||||
logger_all_handler_stderr.setFormatter(LOGGER_ALL_FORMATER)
|
||||
else: # pragma: no cover
|
||||
logger_all_handler_stderr = NULL_HANDLER
|
||||
|
||||
if enable_file and logging_dir is None:
|
||||
raise ValueError("Logging path must be provided to write to log file")
|
||||
elif enable_file:
|
||||
assert logging_dir
|
||||
log_file_path = logging_dir / log_filename
|
||||
logger_all_handler_file = logging.handlers.RotatingFileHandler(
|
||||
log_file_path,
|
||||
encoding="utf-8",
|
||||
maxBytes=5_242_880,
|
||||
backupCount=1,
|
||||
delay=True,
|
||||
)
|
||||
logger_all_handler_file.setLevel(DEFAULT_LOGLEVEL_FILE)
|
||||
logger_all_handler_file.setFormatter(LOGGER_ALL_FORMATER)
|
||||
else: # pragma: no cover
|
||||
logger_all_handler_file = NULL_HANDLER
|
||||
|
||||
BASE_LOGGER.addHandler(logger_all_handler_stderr)
|
||||
BASE_LOGGER.addHandler(logger_all_handler_file)
|
||||
|
||||
|
||||
def disable_logging() -> None:
|
||||
handlers = tuple(BASE_LOGGER.handlers)
|
||||
for handler in handlers:
|
||||
BASE_LOGGER.removeHandler(handler)
|
||||
|
||||
BASE_LOGGER.addHandler(NULL_HANDLER)
|
||||
Reference in New Issue
Block a user