45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
from datetime import datetime
|
|
from logging import Handler
|
|
|
|
from rich._null_file import NullFile
|
|
from rich.console import Console
|
|
from rich.text import Text
|
|
|
|
|
|
class FtRichHandler(Handler):
|
|
"""
|
|
Basic colorized logging handler using Rich.
|
|
Does not support all features of the standard logging handler, and uses a hard-coded log format
|
|
"""
|
|
|
|
def __init__(self, console: Console, *args, **kwargs) -> None:
|
|
super().__init__(*args, **kwargs)
|
|
self._console = console
|
|
|
|
def emit(self, record):
|
|
try:
|
|
msg = self.format(record)
|
|
# Format log message
|
|
log_time = Text(
|
|
datetime.fromtimestamp(record.created).strftime("%Y-%m-%d %H:%M:%S,%f")[:-3],
|
|
)
|
|
name = Text(record.name, style="violet")
|
|
log_level = Text(record.levelname, style=f"logging.level.{record.levelname.lower()}")
|
|
gray_sep = Text(" - ", style="gray46")
|
|
|
|
if isinstance(self._console.file, NullFile):
|
|
# Handles pythonw, where stdout/stderr are null, and we return NullFile
|
|
# instance from Console.file. In this case, we still want to make a log record
|
|
# even though we won't be writing anything to a file.
|
|
self.handleError(record)
|
|
return
|
|
|
|
self._console.print(
|
|
Text() + log_time + gray_sep + name + gray_sep + log_level + gray_sep + msg
|
|
)
|
|
|
|
except RecursionError:
|
|
raise
|
|
except Exception:
|
|
self.handleError(record)
|