en-tts / en_tts_app /logging_configuration.py
stefantaubert's picture
update
f7244fb
raw
history blame
4.01 kB
import logging
import os
import platform
import sys
from logging import Formatter, Handler, Logger, StreamHandler, getLogger
from pathlib import Path
from pkgutil import iter_modules
from en_tts_app.globals import APP_VERSION
class ConsoleFormatter(logging.Formatter):
"""Logging colored formatter, adapted from https://stackoverflow.com/a/56944256/3638629"""
purple = '\x1b[34m'
blue = '\x1b[36m'
# blue = '\x1b[38;5;39m'
yellow = '\x1b[38;5;226m'
red = '\x1b[1;49;31m'
bold_red = '\x1b[1;49;31m'
reset = '\x1b[0m'
collected_loggers = set()
def __init__(self):
super().__init__()
self.datefmt = '%H:%M:%S'
fmt = '(%(levelname)s) %(message)s'
fmt_info = '%(message)s'
self.fmts = {
logging.NOTSET: self.purple + fmt + self.reset,
logging.DEBUG: self.blue + fmt + self.reset,
logging.INFO: fmt_info,
logging.WARNING: self.yellow + fmt + self.reset,
logging.ERROR: self.red + fmt + self.reset,
logging.CRITICAL: self.bold_red + fmt + self.reset,
}
def format(self, record):
log_fmt = self.fmts.get(record.levelno)
formatter = logging.Formatter(log_fmt, self.datefmt)
self.collected_loggers.add(record.name)
return formatter.format(record)
def add_console_out(logger: Logger) -> StreamHandler:
console = StreamHandler()
logger.addHandler(console)
set_console_formatter(console)
return console
def set_console_formatter(handler: Handler) -> None:
logging_formatter = ConsoleFormatter()
handler.setFormatter(logging_formatter)
def set_logfile_formatter(handler: Handler) -> None:
fmt = '[%(asctime)s.%(msecs)03d] %(name)s (%(levelname)s) %(message)s'
datefmt = '%Y/%m/%d %H:%M:%S'
logging_formatter = Formatter(fmt, datefmt)
handler.setFormatter(logging_formatter)
def get_app_logger() -> Logger:
logger = getLogger("en_tts_app")
return logger
def get_file_logger() -> Logger:
flogger = getLogger("file.en_tts_app")
return flogger
def configure_app_logger(level: int) -> None:
app_logger = get_app_logger()
app_logger.handlers.clear()
assert len(app_logger.handlers) == 0
console_handler = add_console_out(app_logger)
# console_handler.setLevel(logging.DEBUG if debug else logging.INFO)
app_logger.setLevel(level)
core_logger = getLogger("en_tts")
core_logger.parent = app_logger
file_logger = get_file_logger()
app_logger.parent = file_logger
def configure_root_logger(level: int) -> None:
# productive = False
# loglevel = logging.INFO if productive else logging.DEBUG
root_logger = getLogger()
root_logger.setLevel(level)
root_logger.manager.disable = logging.NOTSET
if len(root_logger.handlers) > 0:
console = root_logger.handlers[0]
set_console_formatter(console)
else:
console = add_console_out(root_logger)
# console.setLevel(logging.DEBUG if debug else logging.INFO)
def configure_file_logger(path: Path, level: int):
flogger = get_file_logger()
assert len(flogger.handlers) == 0
path.parent.mkdir(parents=True, exist_ok=True)
if path.is_file():
os.remove(path)
path.write_text("")
fh = logging.FileHandler(path)
set_logfile_formatter(fh)
# fh.setLevel(logging.DEBUG if debug else logging.INFO)
flogger.setLevel(level)
# mh = MemoryHandler(buffer_capacity, logging.ERROR, fh, True)
flogger.addHandler(fh)
if flogger.propagate:
flogger.propagate = False
def log_sysinfo():
flogger = get_file_logger()
sys_version = sys.version.replace('\n', '')
flogger.debug(f"CLI version: {APP_VERSION}")
flogger.debug(f"Python version: {sys_version}")
flogger.debug("Modules: %s", ', '.join(sorted(p.name for p in iter_modules())))
my_system = platform.uname()
flogger.debug(f"System: {my_system.system}")
flogger.debug(f"Node Name: {my_system.node}")
flogger.debug(f"Release: {my_system.release}")
flogger.debug(f"Version: {my_system.version}")
flogger.debug(f"Machine: {my_system.machine}")
flogger.debug(f"Processor: {my_system.processor}")