phlyght/phlyght/log.py

81 lines
2.2 KiB
Python

from logging import _STYLES, Filter, LogRecord, StrFormatStyle, basicConfig, getLogger
from re import compile
from rich.console import Console
from rich.logging import RichHandler
LOG_LEVEL = "INFO"
re_ansi = compile(r"(\x1b\[(?:[0-9]*;?)?[0-9][0-9;]*?m)|(\x1b\[0m(?!;))")
logger = getLogger("rich")
console2 = Console(tab_size=4, stderr=True, log_time_format="%a %h-%d.%H:%M:%S")
log_file = Console(file=open("phlyght.log", "w"), log_time_format="%a %h-%d.%H:%M:%S")
console_handler = RichHandler(
LOG_LEVEL,
console2,
log_time_format="%a %h-%d.%H:%M:%S.%f",
rich_tracebacks=True,
show_time=True,
)
file_handler = RichHandler(
LOG_LEVEL,
log_file,
log_time_format="%a %h-%d.%H:%M:%S.%f",
rich_tracebacks=True,
show_time=True,
)
class LogFilter(Filter):
def filter(self, record):
return True
class Format(StrFormatStyle):
def __init__(self, fmt, defaults):
self._fmt = fmt
super().__init__(fmt, defaults=defaults)
def format(self, record: LogRecord):
message = record.getMessage()
if record.pathname:
record.pathname = "/".join(record.pathname.split("/")[::-1][:3][::-1])
message = re_ansi.sub("", message)
return self._fmt.format(
levelname=record.levelname,
pathname=record.pathname,
lineno=record.lineno,
module=record.module,
message=message,
filename=record.filename,
created=record.created,
args=record.args,
levelno=record.levelno,
func_name=record.funcName,
stack_info=record.stack_info,
thread=record.thread,
thread_name=record.threadName,
exc_text=record.exc_text,
exc_info=record.exc_info,
)
_STYLES["&"] = (Format, "{message}") # type: ignore
logger.addHandler(console_handler)
logger.addHandler(file_handler)
console_handler.addFilter(LogFilter())
logger.setLevel(LOG_LEVEL)
for k, v in logger.root.manager.loggerDict.items():
logger.root.manager.loggerDict[k] = logger
basicConfig(
level=LOG_LEVEL,
style="&", # type: ignore
handlers=[console_handler, file_handler],
force=True,
)