Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion rich/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ def __init__(
) -> None:
super().__init__(level=level)
self.console = console or get_console()
self._highlighter = highlighter
self.highlighter = highlighter or self.HIGHLIGHTER_CLASS()
self._log_render = LogRender(
show_time=show_time,
Expand Down Expand Up @@ -200,7 +201,10 @@ def render_message(self, record: LogRecord, message: str) -> ConsoleRenderable:
use_markup = getattr(record, "markup", self.markup)
message_text = Text.from_markup(message) if use_markup else Text(message)

highlighter = getattr(record, "highlighter", self.highlighter)
if "highlighter" in record.__dict__:
highlighter = record.highlighter
else:
highlighter = self._highlighter or self.console.highlighter
if highlighter:
message_text = highlighter(message_text)

Expand Down
22 changes: 22 additions & 0 deletions tests/test_logging.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import io
import os
import logging
import re
from typing import Optional

import pytest

from rich.console import Console
from rich.highlighter import ReprHighlighter
from rich.logging import RichHandler

handler = RichHandler(
Expand Down Expand Up @@ -160,3 +162,23 @@ def test_markup_and_highlight():
render_plain = handler.console.file.getvalue()
assert "FORMATTER" in render_plain
assert log_message in render_plain


def test_handler_uses_console_highlighter_when_not_overridden():
class HashHighlighter(ReprHighlighter):
highlights = [
*ReprHighlighter.highlights,
re.compile(r"\b(?P<git_hash>FOO)\b"),
]

console = Console(highlighter=HashHighlighter())
handler = RichHandler(console=console)
record = logging.LogRecord("rich", logging.INFO, __file__, 1, "message", (), None)

rendered = handler.render_message(record, "A git hash FOO")

assert rendered.plain == "A git hash FOO"
assert len(rendered.spans) == 1
assert rendered.spans[0].start == 11
assert rendered.spans[0].end == 14
assert rendered.spans[0].style == "repr.git_hash"