Spaces:
Sleeping
Sleeping
File size: 4,007 Bytes
a31f9ef f7244fb a31f9ef f7244fb a31f9ef |
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
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}")
|