Refactor logging

This commit is contained in:
Will McGugan 2020-12-29 12:30:28 +00:00
parent f96e62c011
commit 7fa7001546
2 changed files with 52 additions and 20 deletions

View File

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- MarkupError exception raise from None to omit internal exception - MarkupError exception raise from None to omit internal exception
- Factored out RichHandler.render and RichHandler.render_message for easier extending
### Added ### Added

View File

@ -6,7 +6,7 @@ from typing import ClassVar, List, Optional, Type, Union
from . import get_console from . import get_console
from ._log_render import LogRender from ._log_render import LogRender
from .console import Console from .console import Console, ConsoleRenderable
from .highlighter import Highlighter, ReprHighlighter from .highlighter import Highlighter, ReprHighlighter
from .text import Text from .text import Text
from .traceback import Traceback from .traceback import Traceback
@ -110,11 +110,7 @@ class RichHandler(Handler):
def emit(self, record: LogRecord) -> None: def emit(self, record: LogRecord) -> None:
"""Invoked by logging.""" """Invoked by logging."""
path = Path(record.pathname).name
level = self.get_level_text(record)
message = self.format(record) message = self.format(record)
time_format = None if self.formatter is None else self.formatter.datefmt
log_time = datetime.fromtimestamp(record.created)
traceback = None traceback = None
if ( if (
@ -139,31 +135,66 @@ class RichHandler(Handler):
) )
message = record.getMessage() message = record.getMessage()
message_renderable = self.render_message(record, message)
log_renderable = self.render(
record=record, traceback=traceback, message_renderable=message_renderable
)
self.console.print(log_renderable)
def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable":
"""Render message text in to Text.
record (LogRecord): logging Record.
message (str): String cotaining log message.
Returns:
ConsoleRenderable: Renderable to display log message.
"""
use_markup = ( use_markup = (
getattr(record, "markup") if hasattr(record, "markup") else self.markup getattr(record, "markup") if hasattr(record, "markup") else self.markup
) )
if use_markup: message_text = Text.from_markup(message) if use_markup else Text(message)
message_text = Text.from_markup(message)
else:
message_text = Text(message)
if self.highlighter: if self.highlighter:
message_text = self.highlighter(message_text) message_text = self.highlighter(message_text)
if self.KEYWORDS: if self.KEYWORDS:
message_text.highlight_words(self.KEYWORDS, "logging.keyword") message_text.highlight_words(self.KEYWORDS, "logging.keyword")
self.console.print( return message_text
self._log_render(
self.console, def render(
[message_text] if not traceback else [message_text, traceback], self,
log_time=log_time, *,
time_format=time_format, record: LogRecord,
level=level, traceback: Optional[Traceback],
path=path, message_renderable: "ConsoleRenderable",
line_no=record.lineno, ) -> "ConsoleRenderable":
link_path=record.pathname if self.enable_link_path else None, """Render log for display.
)
Args:
record (LogRecord): logging Record.
traceback (Optional[Traceback]): Traceback instance or None for no Traceback.
message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents.
Returns:
ConsoleRenderable: Renderable to display log.
"""
path = Path(record.pathname).name
level = self.get_level_text(record)
time_format = None if self.formatter is None else self.formatter.datefmt
log_time = datetime.fromtimestamp(record.created)
log_renderable = self._log_render(
self.console,
[message_renderable] if not traceback else [message_renderable, traceback],
log_time=log_time,
time_format=time_format,
level=level,
path=path,
line_no=record.lineno,
link_path=record.pathname if self.enable_link_path else None,
) )
return log_renderable
if __name__ == "__main__": # pragma: no cover if __name__ == "__main__": # pragma: no cover