diff --git a/package/logger_36/catalog/config/console_rich.py b/package/logger_36/catalog/config/console_rich.py index ac483c746071b46f4af60f3f48795ef52bdbc366..611b2ee0ab6fb96a135ee40ab265c57d47b6077a 100644 --- a/package/logger_36/catalog/config/console_rich.py +++ b/package/logger_36/catalog/config/console_rich.py @@ -25,7 +25,6 @@ LEVEL_COLOR: dict[int, str | style_t] = { ACTUAL_COLOR = LEVEL_COLOR[lggg.CRITICAL] EXPECTED_COLOR = "green3" DATE_TIME_COLOR = "sky_blue3" -ELAPSED_TIME_COLOR = DATE_TIME_COLOR ALTERNATIVE_BACKGROUND_FOR_LIGHT = style_t(bgcolor=color_t.from_rgb(230, 230, 230)) ALTERNATIVE_BACKGROUND_FOR_DARK = style_t(bgcolor=color_t.from_rgb(25, 25, 25)) diff --git a/package/logger_36/catalog/handler/README.txt b/package/logger_36/catalog/handler/README.txt index 8762597949d64be9ddcf18a258ef3c81c38b48f0..40a38b7aa4f95b34e8cb80ef9afa5152e9b323a2 100644 --- a/package/logger_36/catalog/handler/README.txt +++ b/package/logger_36/catalog/handler/README.txt @@ -1,3 +1,4 @@ --- Note concerning: def emit(self, record: lggg.LogRecord, /) -> None: The attribute "message" is not yet defined in record. It will be set by format(). Use "msg" instead. +Same remark with asctime. diff --git a/package/logger_36/catalog/handler/console.py b/package/logger_36/catalog/handler/console.py index 14fd3522d10d5a0fed7c0c5d92bb9b2bc9ff9223..eb6a1e086b977e404fcae55777f1dccce773abdd 100644 --- a/package/logger_36/catalog/handler/console.py +++ b/package/logger_36/catalog/handler/console.py @@ -18,12 +18,11 @@ from logger_36.type.handler import handler_extension_t @d.dataclass(slots=True, repr=False, eq=False) class console_handler_t(lggg.Handler): extension: handler_extension_t = d.field(init=False) - FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False) + MessageFromRecord: h.Callable[..., tuple[str, str | None]] = d.field(init=False) name: d.InitVar[str | None] = None level: d.InitVar[int] = lggg.NOTSET - show_where: d.InitVar[bool] = True - show_memory_usage: d.InitVar[bool] = False + should_store_memory_usage: d.InitVar[bool] = False message_width: d.InitVar[int] = -1 formatter: d.InitVar[lggg.Formatter | None] = None @@ -31,8 +30,7 @@ class console_handler_t(lggg.Handler): self, name: str | None, level: int, - show_where: bool, - show_memory_usage: bool, + should_store_memory_usage: bool, message_width: int, formatter: lggg.Formatter | None, ) -> None: @@ -41,22 +39,21 @@ class console_handler_t(lggg.Handler): self.extension = handler_extension_t( name=name, - show_where=show_where, - show_memory_usage=show_memory_usage, + should_store_memory_usage=should_store_memory_usage, handler=self, level=level, message_width=message_width, formatter=formatter, ) - self.FormattedLines = self.extension.FormattedLines + self.MessageFromRecord = self.extension.MessageFromRecord def emit(self, record: lggg.LogRecord, /) -> None: """""" if hasattr(record, SHOW_W_RULE_ATTR): message = RuleAsText(record.msg) else: - message, _ = self.FormattedLines(record, should_join_lines=True) + message = self.MessageFromRecord(record) print(message) def ShowMessage(self, message: str, /, *, indented: bool = False) -> None: diff --git a/package/logger_36/catalog/handler/console_rich.py b/package/logger_36/catalog/handler/console_rich.py index d92457d2a627df9e90a1f4271024db4368796940..6c3c712d2dddd60ca6216224af9e1c00494418cf 100644 --- a/package/logger_36/catalog/handler/console_rich.py +++ b/package/logger_36/catalog/handler/console_rich.py @@ -14,20 +14,13 @@ from logger_36.catalog.config.console_rich import ( ALTERNATIVE_BACKGROUND_FOR_DARK, ALTERNATIVE_BACKGROUND_FOR_LIGHT, DATE_TIME_COLOR, - ELAPSED_TIME_COLOR, EXPECTED_COLOR, GRAY_COLOR, LEVEL_COLOR, WHITE_COLOR, ) -from logger_36.config.message import ( - ACTUAL_PATTERNS, - ELAPSED_TIME_SEPARATOR, - EXPECTED_PATTERNS, - LEVEL_CLOSING, - WHERE_SEPARATOR, -) -from logger_36.constant.message import LINE_INDENT +from logger_36.config.message import ACTUAL_PATTERNS, EXPECTED_PATTERNS, WHERE_SEPARATOR +from logger_36.constant.message import CONTEXT_LENGTH, LINE_INDENT from logger_36.constant.record import SHOW_W_RULE_ATTR from logger_36.task.format.rule import Rule from logger_36.type.handler import handler_extension_t @@ -64,14 +57,13 @@ class console_rich_handler_t(lggg.Handler): extension: handler_extension_t = d.field(init=False) console: console_t = d.field(init=False) - FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False) + MessageFromRecord: h.Callable[..., str] = d.field(init=False) alternating_lines: int = 0 background_is_light: bool = True name: d.InitVar[str | None] = None level: d.InitVar[int] = lggg.NOTSET - show_where: d.InitVar[bool] = True - show_memory_usage: d.InitVar[bool] = False + should_store_memory_usage: d.InitVar[bool] = False message_width: d.InitVar[int] = -1 formatter: d.InitVar[lggg.Formatter | None] = None should_install_traceback: d.InitVar[bool] = False @@ -83,8 +75,7 @@ class console_rich_handler_t(lggg.Handler): self, name: str | None, level: int, - show_where: bool, - show_memory_usage: bool, + should_store_memory_usage: bool, message_width: int, formatter: lggg.Formatter | None, should_install_traceback: bool, @@ -96,8 +87,7 @@ class console_rich_handler_t(lggg.Handler): self.extension = handler_extension_t( name=name, - show_where=show_where, - show_memory_usage=show_memory_usage, + should_store_memory_usage=should_store_memory_usage, handler=self, level=level, message_width=message_width, @@ -127,7 +117,7 @@ class console_rich_handler_t(lggg.Handler): rich_traceback_kwargs["console"] = self.console InstallTracebackHandler(**rich_traceback_kwargs) - self.FormattedLines = self.extension.FormattedLines + self.MessageFromRecord = self.extension.MessageFromRecord if self.alternating_lines == 1: self.alternating_lines = 0 self.background_is_light = False @@ -142,14 +132,13 @@ class console_rich_handler_t(lggg.Handler): if hasattr(record, SHOW_W_RULE_ATTR): richer = Rule(record.msg, DATE_TIME_COLOR) else: - first, next_s = self.FormattedLines(record, PreProcessed=EscapedVersion) + message = self.MessageFromRecord(record, PreProcessed=EscapedVersion) should_highlight_back = self.alternating_lines == 1 if self.alternating_lines >= 0: self.alternating_lines = (self.alternating_lines + 1) % 2 richer = HighlightedVersion( self.console, - first, - next_s, + message, record.levelno, should_highlight_back=should_highlight_back, background_is_light=self.background_is_light, @@ -172,8 +161,7 @@ class console_rich_handler_t(lggg.Handler): def HighlightedVersion( _: console_t, - first_line: str, - next_lines: str | None, + message: str, log_level: int, /, *, @@ -181,24 +169,13 @@ def HighlightedVersion( background_is_light: bool = True, ) -> renderable_t: """""" - output = text_t(first_line, WHITE_COLOR) - - # Used instead of _CONTEXT_LENGTH which might include \t, thus creating a - # mismatch between character length and length when displayed in console. - context_end = first_line.find(LEVEL_CLOSING) - elapsed_time_separator = first_line.rfind(ELAPSED_TIME_SEPARATOR) - where_separator = first_line.rfind( - WHERE_SEPARATOR, context_end, elapsed_time_separator - ) - - output.stylize(LEVEL_COLOR[log_level], end=context_end + 1) - output.stylize(GRAY_COLOR, start=where_separator, end=elapsed_time_separator) - output.stylize(ELAPSED_TIME_COLOR, start=elapsed_time_separator) - - if next_lines is not None: - output.append(next_lines) + output = text_t(message, WHITE_COLOR) - _ = output.highlight_regex(ACTUAL_PATTERNS, style=ACTUAL_COLOR) + output.stylize(LEVEL_COLOR[log_level], end=CONTEXT_LENGTH) + where = message.rfind(WHERE_SEPARATOR) + if (where >= 0) and ("\n" not in message[where:]): + output.stylize(GRAY_COLOR, start=where) + _ = output.highlight_words(ACTUAL_PATTERNS, style=ACTUAL_COLOR) _ = output.highlight_regex(EXPECTED_PATTERNS, style=EXPECTED_COLOR) if should_highlight_back: diff --git a/package/logger_36/catalog/handler/file.py b/package/logger_36/catalog/handler/file.py index 2e7409a568f8ce207a9f10f7ccb1400a56723270..4ddc305208efb5ce590bd08597cff07dd40cd9c3 100644 --- a/package/logger_36/catalog/handler/file.py +++ b/package/logger_36/catalog/handler/file.py @@ -20,12 +20,11 @@ from logger_36.type.handler import handler_extension_t class file_handler_t(lggg.FileHandler): extension: handler_extension_t = d.field(init=False) - FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False) + MessageFromRecord: h.Callable[..., tuple[str, str | None]] = d.field(init=False) name: d.InitVar[str | None] = None level: d.InitVar[int] = lggg.NOTSET - show_where: d.InitVar[bool] = True - show_memory_usage: d.InitVar[bool] = False + should_store_memory_usage: d.InitVar[bool] = False message_width: d.InitVar[int] = -1 formatter: d.InitVar[lggg.Formatter | None] = None @@ -37,8 +36,7 @@ class file_handler_t(lggg.FileHandler): self, name: str | None, level: int, - show_where: bool, - show_memory_usage: bool, + should_store_memory_usage: bool, message_width: int, formatter: lggg.Formatter | None, path: path_t | None, @@ -50,22 +48,21 @@ class file_handler_t(lggg.FileHandler): self.extension = handler_extension_t( name=name, - show_where=show_where, - show_memory_usage=show_memory_usage, + should_store_memory_usage=should_store_memory_usage, handler=self, level=level, message_width=message_width, formatter=formatter, ) - self.FormattedLines = self.extension.FormattedLines + self.MessageFromRecord = self.extension.MessageFromRecord def emit(self, record: lggg.LogRecord, /) -> None: """""" if hasattr(record, SHOW_W_RULE_ATTR): message = RuleAsText(record.msg) else: - message, _ = self.FormattedLines(record, should_join_lines=True) + message = self.MessageFromRecord(record) print(message, file=self.stream) self.stream.flush() diff --git a/package/logger_36/catalog/handler/generic.py b/package/logger_36/catalog/handler/generic.py index 6fdd1732238e46a9119f3f8b0f7444f3693e208b..e6a98142f5b5be0723b4d98c1ea20de2782b9043 100644 --- a/package/logger_36/catalog/handler/generic.py +++ b/package/logger_36/catalog/handler/generic.py @@ -60,12 +60,11 @@ class generic_handler_t(lggg.Handler): DisplayRule: display_rule_p = d.field(init=False) extension: handler_extension_t = d.field(init=False) - FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False) + MessageFromRecord: h.Callable[..., tuple[str, str | None]] = d.field(init=False) name: d.InitVar[str | None] = None level: d.InitVar[int] = lggg.NOTSET - show_where: d.InitVar[bool] = True - show_memory_usage: d.InitVar[bool] = False + should_store_memory_usage: d.InitVar[bool] = False message_width: d.InitVar[int] = -1 formatter: d.InitVar[lggg.Formatter | None] = None @@ -77,8 +76,7 @@ class generic_handler_t(lggg.Handler): self, name: str | None, level: int, - show_where: bool, - show_memory_usage: bool, + should_store_memory_usage: bool, message_width: int, formatter: lggg.Formatter | None, supports_html: bool, @@ -90,8 +88,7 @@ class generic_handler_t(lggg.Handler): self.extension = handler_extension_t( name=name, - show_where=show_where, - show_memory_usage=show_memory_usage, + should_store_memory_usage=should_store_memory_usage, handler=self, level=level, message_width=message_width, @@ -114,7 +111,7 @@ class generic_handler_t(lggg.Handler): else: self.DisplayRule = self._DisplayRuleAsText - self.FormattedLines = self.extension.FormattedLines + self.MessageFromRecord = self.extension.MessageFromRecord if self.alternating_lines == 1: self.alternating_lines = 0 self.background_is_light = False @@ -130,19 +127,18 @@ class generic_handler_t(lggg.Handler): if hasattr(record, SHOW_W_RULE_ATTR): message = RuleAsText(record.msg) else: - message, _ = self.FormattedLines(record, should_join_lines=True) + message = self.MessageFromRecord(record) else: if hasattr(record, SHOW_W_RULE_ATTR): richer = Rule(record.msg, DATE_TIME_COLOR) else: - first, next_s = self.FormattedLines(record, PreProcessed=EscapedForRich) + message = self.MessageFromRecord(record, PreProcessed=EscapedForRich) should_highlight_back = self.alternating_lines == 1 if self.alternating_lines >= 0: self.alternating_lines = (self.alternating_lines + 1) % 2 richer = HighlightedVersion( self.console, - first, - next_s, + message, record.levelno, should_highlight_back=should_highlight_back, background_is_light=self.background_is_light, diff --git a/package/logger_36/catalog/logger/chronos.py b/package/logger_36/catalog/logger/chronos.py index 87f9e72d6bfb5d0e174e778ce7aa29cc6a30f8ba..03a9de1e50934c6de92f208a639b8138144d88c8 100644 --- a/package/logger_36/catalog/logger/chronos.py +++ b/package/logger_36/catalog/logger/chronos.py @@ -4,7 +4,6 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023 SEE COPYRIGHT NOTICE BELOW """ -from logger_36.constant.logger import HIDE_WHERE_KWARG from logger_36.instance.logger import LOGGER from logger_36.task.measure.chronos import ElapsedTime from logger_36.type.logger import logger_t @@ -12,7 +11,7 @@ from logger_36.type.logger import logger_t def LogElapsedTime(*, logger: logger_t = LOGGER) -> None: """""" - logger.info(f"Elapsed Time: {ElapsedTime()}", **HIDE_WHERE_KWARG) + logger.info(f"Elapsed Time: {ElapsedTime()}") """ diff --git a/package/logger_36/catalog/logger/gpu.py b/package/logger_36/catalog/logger/gpu.py index c3dd58f3771751efcb29fc0e64caab9e064303d1..8c22fd2c97d2998795c03a1381baccbe90e3688a 100644 --- a/package/logger_36/catalog/logger/gpu.py +++ b/package/logger_36/catalog/logger/gpu.py @@ -7,7 +7,6 @@ SEE COPYRIGHT NOTICE BELOW import sys as sstm from logger_36.constant.error import GPU_LOGGING_ERROR -from logger_36.constant.logger import HIDE_WHERE_KWARG from logger_36.instance.logger import LOGGER from logger_36.type.logger import logger_t @@ -41,7 +40,6 @@ def LogGPURelatedDetails(*, logger: logger_t = LOGGER) -> None: f" Tensorflow: {tsfl.version.VERSION}\n" f" Tensorflow Build: {tsfl.sysconfig.get_build_info()}\n" f" TensorRT: {tsrt.__version__}", - **HIDE_WHERE_KWARG, ) diff --git a/package/logger_36/catalog/logger/memory.py b/package/logger_36/catalog/logger/memory.py index e5512a284894dd43b0f5dc912698a6ac6c7bb836..7c31de4e33617f54bb1f878a26f7aeda2acd7d20 100644 --- a/package/logger_36/catalog/logger/memory.py +++ b/package/logger_36/catalog/logger/memory.py @@ -5,11 +5,10 @@ SEE COPYRIGHT NOTICE BELOW """ from logger_36.config.memory import LENGTH_100, MAX_N_SAMPLES -from logger_36.constant.logger import HIDE_WHERE_KWARG from logger_36.constant.memory import storage_units_h from logger_36.instance.logger import LOGGER from logger_36.task.format.memory import FormattedUsage, UsageBar -from logger_36.task.format.message import FormattedMessage +from logger_36.task.format.message import MessageWithActualExpected from logger_36.type.logger import logger_t @@ -22,7 +21,7 @@ def LogMemoryUsages( logger: logger_t = LOGGER, ) -> None: """""" - if not logger.any_handler_shows_memory: + if not logger.any_handler_stores_memory: return where_s, usages = zip(*logger.memory_usages) @@ -34,7 +33,7 @@ def LogMemoryUsages( if isinstance(max_n_samples, int): if max_n_samples < 1: raise ValueError( - FormattedMessage( + MessageWithActualExpected( "Invalid maximum number of samples", actual=max_n_samples, expected=1, @@ -65,7 +64,7 @@ def LogMemoryUsages( ) plot = "\n".join(plot) - logger.info(title + plot, **HIDE_WHERE_KWARG) + logger.info(title + plot) def LogMaximumMemoryUsage( @@ -77,12 +76,10 @@ def LogMaximumMemoryUsage( """ unit: b or None=bytes, k=kilo, m=mega, g=giga, a=auto """ - if logger.any_handler_shows_memory: + if logger.any_handler_stores_memory: where, max_usage = logger.max_memory_usage_full value, unit = FormattedUsage(max_usage, unit=unit, decimals=decimals) - logger.info( - f"Max. Memory Usage: {value}{unit} near {where}", **HIDE_WHERE_KWARG - ) + logger.info(f"Max. Memory Usage: {value}{unit} near {where}") """ diff --git a/package/logger_36/catalog/logger/system.py b/package/logger_36/catalog/logger/system.py index 03349e71d27d6de1b52c592f8e8e180032ff45d6..53c99fb5848d6c080018373e9ac19b7f4c2d0374 100644 --- a/package/logger_36/catalog/logger/system.py +++ b/package/logger_36/catalog/logger/system.py @@ -4,7 +4,6 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023 SEE COPYRIGHT NOTICE BELOW """ -from logger_36.constant.logger import HIDE_WHERE_KWARG from logger_36.constant.system import MAX_DETAIL_NAME_LENGTH, SYSTEM_DETAILS_AS_DICT from logger_36.instance.logger import LOGGER from logger_36.task.inspection import Modules @@ -35,7 +34,6 @@ def LogSystemDetails( f"{details}\n" f" {'Python Modules':>{MAX_DETAIL_NAME_LENGTH}}:\n" f"{modules}", - **HIDE_WHERE_KWARG, ) diff --git a/package/logger_36/config/logger.py b/package/logger_36/config/logger.py index e0f75587fe76f69f358c1fc1bed0e48f4b438e71..21b64b17ddd535825ffaf3dae28b48d43653fda8 100644 --- a/package/logger_36/config/logger.py +++ b/package/logger_36/config/logger.py @@ -12,7 +12,7 @@ from logger_36.catalog.handler.file import file_handler_t from logger_36.catalog.handler.generic import generic_handler_t from logger_36.constant.handler import HANDLER_CODES, handler_codes_h from logger_36.instance.logger import LOGGER -from logger_36.task.format.message import FormattedMessage +from logger_36.task.format.message import MessageWithActualExpected def SetLOGLevel( @@ -48,7 +48,7 @@ def SetLOGLevel( if not found: raise ValueError( - FormattedMessage( + MessageWithActualExpected( "Handler not found", actual=which, expected=f"{str(HANDLER_CODES)[1:-1]}, or a handler name", diff --git a/package/logger_36/config/message.py b/package/logger_36/config/message.py index d71812c90e91d8c8f419f1036ea8c98222a2afe8..bf00b25a3449b23553aea3b04da76612de018814 100644 --- a/package/logger_36/config/message.py +++ b/package/logger_36/config/message.py @@ -4,20 +4,19 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023 SEE COPYRIGHT NOTICE BELOW """ +from datetime import timedelta as time_delta_t + LEVEL_OPENING = "(" LEVEL_CLOSING = ")" -MESSAGE_MARKER = "| " +MESSAGE_MARKER = "|" WHERE_SEPARATOR = "@" ELAPSED_TIME_SEPARATOR = "+" -MEMORY_SEPARATOR = ":" DATE_FORMAT = "%Y-%m-%d" TIME_FORMAT = "%H:%M:%S" -WHERE_FORMAT = f" {WHERE_SEPARATOR} {{module}}:{{funcName}}:{{lineno}}" -ELAPSED_TIME_FORMAT = f" {ELAPSED_TIME_SEPARATOR}%(elapsed_time)s" -MEMORY_FORMAT = f" {MEMORY_SEPARATOR}%(memory_usage)s" +LONG_ENOUGH = time_delta_t(minutes=5) -ACTUAL_PATTERNS: str = r" Actual=" +ACTUAL_PATTERNS: tuple[str] = (r" Actual=",) EXPECTED_PATTERNS: str = r" Expected([!<>]?=|: )" """ diff --git a/package/logger_36/constant/logger.py b/package/logger_36/constant/logger.py index eeebb75a7465a6251e1be0fd8e5402377aad4ff4..ed630670c84ea65e09cf16c2c5a83dca4f2d2b12 100644 --- a/package/logger_36/constant/logger.py +++ b/package/logger_36/constant/logger.py @@ -8,8 +8,6 @@ import logging as lggg import re as regx import typing as h -from logger_36.constant.record import HIDE_WHERE_ATTR - LOGGER_NAME = "logger-36" # https://docs.python.org/3/library/logging.html#logging.captureWarnings @@ -17,8 +15,6 @@ WARNING_LOGGER_NAME = "py.warnings" WARNING_TYPE_PATTERN = r"([^:]+):([0-9]+): ([^:]+): ([^\n]+)\n" WARNING_TYPE_COMPILED_PATTERN = regx.compile(WARNING_TYPE_PATTERN) -HIDE_WHERE_KWARG = {"extra": {HIDE_WHERE_ATTR: True}} - # Second version: with self as first parameter. logger_handle_h = ( h.Callable[[lggg.LogRecord], None] | h.Callable[[lggg.Logger, lggg.LogRecord], None] diff --git a/package/logger_36/constant/message.py b/package/logger_36/constant/message.py index 7cbab994d83c83d1d8e03b7a8b4a57f2b718430c..76f16110cc22661bc23bfad9c4f728e2df97e4c9 100644 --- a/package/logger_36/constant/message.py +++ b/package/logger_36/constant/message.py @@ -8,6 +8,7 @@ import time import typing as h from logger_36.config.message import ( + ELAPSED_TIME_SEPARATOR, LEVEL_CLOSING, LEVEL_OPENING, MESSAGE_MARKER, @@ -15,9 +16,10 @@ from logger_36.config.message import ( ) TIME_LENGTH = time.strftime(TIME_FORMAT, time.gmtime(0)).__len__() +TIME_LENGTH_m_1 = TIME_LENGTH - ELAPSED_TIME_SEPARATOR.__len__() LOG_LEVEL_LENGTH = 1 + LEVEL_OPENING.__len__() + LEVEL_CLOSING.__len__() CONTEXT_LENGTH = TIME_LENGTH + LOG_LEVEL_LENGTH -LINE_INDENT = (CONTEXT_LENGTH + MESSAGE_MARKER.__len__() + 1) * " " +LINE_INDENT = (CONTEXT_LENGTH + MESSAGE_MARKER.__len__() + 2) * " " NEXT_LINE_PROLOGUE = "\n" + LINE_INDENT expected_op_h = h.Literal[":", ": ", "=", "!=", ">=", "<="] diff --git a/package/logger_36/constant/record.py b/package/logger_36/constant/record.py index e6f2e30568690c0c866ae9fd1c0707793a10c6a4..cc580243e36c0bf2a58602ee4f3e4e210e6f5edb 100644 --- a/package/logger_36/constant/record.py +++ b/package/logger_36/constant/record.py @@ -4,10 +4,9 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023 SEE COPYRIGHT NOTICE BELOW """ -SHOW_W_RULE_ATTR = "show_w_rule" -SHOW_WHERE_ATTR = "where" -HIDE_WHERE_ATTR = "hide_where" -SHOW_MEMORY_ATTR = "show_memory_usage" +SHOW_W_RULE_ATTR = "should_show_w_rule" +STORE_MEMORY_ATTR = "should_store_memory_usage" +HIDE_WHERE_ATTR = "should_hide_where" """ COPYRIGHT NOTICE diff --git a/package/logger_36/content.py b/package/logger_36/content.py index 9342291c473dbd72f7c437d243cc297d4c369462..4e82a1609be5908d5098bc35db0f6285f201e02a 100644 --- a/package/logger_36/content.py +++ b/package/logger_36/content.py @@ -5,7 +5,7 @@ SEE COPYRIGHT NOTICE BELOW """ from logger_36.constant.message import LINE_INDENT -from logger_36.task.format.message import FormattedMessage +from logger_36.task.format.message import MessageWithActualExpected from logger_36.task.format.rule import Rule, RuleAsText """ diff --git a/package/logger_36/handler.py b/package/logger_36/handler.py index cddf27a99b0217c16b7783e693a7cbaa23594484..b493b57da29e2e709acd34fb59e216bdb2642df2 100644 --- a/package/logger_36/handler.py +++ b/package/logger_36/handler.py @@ -33,8 +33,7 @@ def AddGenericHandler( logger: lggg.Logger | None = None, name: str | None = None, level: int = lggg.INFO, - show_where: bool = True, - show_memory_usage: bool = False, + should_store_memory_usage: bool = False, message_width: int = -1, formatter: lggg.Formatter | None = None, supports_html: bool = False, @@ -50,8 +49,7 @@ def AddGenericHandler( handler = generic_handler_t( name=name, level=level, - show_where=show_where, - show_memory_usage=show_memory_usage, + should_store_memory_usage=should_store_memory_usage, message_width=message_width, formatter=formatter, supports_html=supports_html, @@ -68,8 +66,7 @@ def AddConsoleHandler( logger: lggg.Logger | None = None, name: str | None = None, level: int = lggg.INFO, - show_where: bool = True, - show_memory_usage: bool = False, + should_store_memory_usage: bool = False, message_width: int = -1, formatter: lggg.Formatter | None = None, should_hold_messages: bool = False, @@ -81,8 +78,7 @@ def AddConsoleHandler( handler = console_handler_t( name=name, level=level, - show_where=show_where, - show_memory_usage=show_memory_usage, + should_store_memory_usage=should_store_memory_usage, message_width=message_width, formatter=formatter, ) @@ -94,8 +90,7 @@ def AddRichConsoleHandler( logger: lggg.Logger | None = None, name: str | None = None, level: int = lggg.INFO, - show_where: bool = True, - show_memory_usage: bool = False, + should_store_memory_usage: bool = False, message_width: int = -1, formatter: lggg.Formatter | None = None, alternating_lines: int = 2, @@ -125,8 +120,7 @@ def AddRichConsoleHandler( handler = console_rich_handler_t( name=name, level=level, - show_where=show_where, - show_memory_usage=show_memory_usage, + should_store_memory_usage=should_store_memory_usage, message_width=message_width, formatter=formatter, **additional_s, @@ -141,8 +135,7 @@ def AddFileHandler( logger: lggg.Logger | None = None, name: str | None = None, level: int = lggg.INFO, - show_where: bool = True, - show_memory_usage: bool = False, + should_store_memory_usage: bool = False, message_width: int = -1, formatter: lggg.Formatter | None = None, should_hold_messages: bool = False, @@ -159,8 +152,7 @@ def AddFileHandler( handler = file_handler_t( name=name, level=level, - show_where=show_where, - show_memory_usage=show_memory_usage, + should_store_memory_usage=should_store_memory_usage, message_width=message_width, formatter=formatter, path=path, diff --git a/package/logger_36/task/format/memory.py b/package/logger_36/task/format/memory.py index 1f6cc5364a01a99d65828c964e613805eb69ee22..5c4a433bab74adcf03d5ff02e74a100c8bf2b1d6 100644 --- a/package/logger_36/task/format/memory.py +++ b/package/logger_36/task/format/memory.py @@ -5,7 +5,7 @@ SEE COPYRIGHT NOTICE BELOW """ from logger_36.constant.memory import STORAGE_UNITS, storage_units_h -from logger_36.task.format.message import FormattedMessage +from logger_36.task.format.message import MessageWithActualExpected _KILO_UNIT = 1000.0 _MEGA_UNIT = _KILO_UNIT * 1000.0 @@ -41,7 +41,7 @@ def FormattedUsage( value, unit = FormattedUsageWithAutoUnit(usage, decimals) else: raise ValueError( - FormattedMessage( + MessageWithActualExpected( "Invalid unit", actual=unit, expected=str(STORAGE_UNITS)[1:-1] ) ) diff --git a/package/logger_36/task/format/message.py b/package/logger_36/task/format/message.py index cff6f75b949cfd0fb3e2fe0c3efce768575de640..89d51233ce6ce672b3a303e7d5abbd2f977758c8 100644 --- a/package/logger_36/task/format/message.py +++ b/package/logger_36/task/format/message.py @@ -7,35 +7,11 @@ SEE COPYRIGHT NOTICE BELOW import difflib as diff import typing as h -from logger_36.config.message import ( - ELAPSED_TIME_FORMAT, - LEVEL_CLOSING, - LEVEL_OPENING, - MEMORY_FORMAT, - MESSAGE_MARKER, -) from logger_36.constant.generic import NOT_PASSED from logger_36.constant.message import expected_op_h -def MessageFormat(with_where: bool, with_memory_usage: bool, /) -> str: - """""" - output = [ - f"%(asctime)s" - f"{LEVEL_OPENING}%(level_first_letter)s{LEVEL_CLOSING}\t" - f"{MESSAGE_MARKER}%(message)s" - ] - - if with_where: - output.append("%(where)s") - output.append(ELAPSED_TIME_FORMAT) - if with_memory_usage: - output.append(MEMORY_FORMAT) - - return "".join(output) - - -def FormattedMessage( +def MessageWithActualExpected( message: str, /, *, diff --git a/package/logger_36/task/measure/chronos.py b/package/logger_36/task/measure/chronos.py index 7b35f324966f83fe18e40f7e28d1fd422dd285d7..8c3117bffcd536c8fbe1fc3baa0d5b4428b22e42 100644 --- a/package/logger_36/task/measure/chronos.py +++ b/package/logger_36/task/measure/chronos.py @@ -5,25 +5,35 @@ SEE COPYRIGHT NOTICE BELOW """ import time -from datetime import datetime as dttm +from datetime import datetime as date_time_t # This module is imported early. Therefore, the current date and time should be close # enough to the real start time of the main script. -_START_DATE_AND_TIME = dttm.now() +_START_DATE_AND_TIME = date_time_t.now() def TimeStamp(*, precision: str = "microseconds") -> str: """""" - return dttm.now().isoformat(timespec=precision).replace(".", "-").replace(":", "-") + return ( + date_time_t.now() + .isoformat(timespec=precision) + .replace(".", "-") + .replace(":", "-") + ) -def ElapsedTime() -> str: +def ElapsedTime( + *, should_return_now: bool = False +) -> str | tuple[str, date_time_t.date]: """""" - elapsed_seconds = (dttm.now() - _START_DATE_AND_TIME).total_seconds() - output = time.strftime("%Hh %Mm %Ss", time.gmtime(elapsed_seconds)) - while output.startswith("00") and (" " in output): - output = output.split(maxsplit=1)[-1] - + now = date_time_t.now() + elapsed_seconds = (now - _START_DATE_AND_TIME).total_seconds() + output = time.strftime("%H:%M:%S", time.gmtime(elapsed_seconds)) + while output.startswith("00:"): + output = output.split(sep=":", maxsplit=1)[-1] + + if should_return_now: + return output, now return output diff --git a/package/logger_36/type/handler.py b/package/logger_36/type/handler.py index f8eda8074b134d4f2e1a5d8de5dffbdf3b292b04..57bc279ba8d5f88416dc22c162927b8ece458752 100644 --- a/package/logger_36/type/handler.py +++ b/package/logger_36/type/handler.py @@ -8,15 +8,17 @@ import dataclasses as d import logging as lggg import sys as sstm import typing as h -from os import sep as FOLDER_SEPARATOR -from pathlib import Path as path_t -from logger_36.config.message import TIME_FORMAT, WHERE_FORMAT +from logger_36.config.message import ( + LEVEL_CLOSING, + LEVEL_OPENING, + MESSAGE_MARKER, + WHERE_SEPARATOR, +) from logger_36.constant.error import MEMORY_MEASURE_ERROR from logger_36.constant.handler import HANDLER_CODES from logger_36.constant.message import NEXT_LINE_PROLOGUE -from logger_36.constant.record import HIDE_WHERE_ATTR, SHOW_WHERE_ATTR -from logger_36.task.format.message import FormattedMessage, MessageFormat +from logger_36.task.format.message import MessageWithActualExpected from logger_36.task.measure.chronos import TimeStamp from logger_36.task.measure.memory import CanCheckUsage as CanCheckMemoryUsage @@ -26,10 +28,9 @@ _MEMORY_MEASURE_ERROR = MEMORY_MEASURE_ERROR @d.dataclass(slots=True, repr=False, eq=False) class handler_extension_t: name: str | None = None - show_where: bool = True - show_memory_usage: bool = False + should_store_memory_usage: bool = False message_width: int = -1 - FormattedRecord: h.Callable[[lggg.LogRecord], str] = d.field(init=False) + MessageFromRecord: h.Callable[..., str] = d.field(init=False) handler: d.InitVar[lggg.Handler | None] = None level: d.InitVar[int] = lggg.NOTSET @@ -43,7 +44,7 @@ class handler_extension_t: if self.name in HANDLER_CODES: raise ValueError( - FormattedMessage( + MessageWithActualExpected( "Invalid handler name", actual=self.name, expected=f"a name not in {str(HANDLER_CODES)[1:-1]}", @@ -53,8 +54,8 @@ class handler_extension_t: if self.name is None: self.name = TimeStamp() - if self.show_memory_usage and not CanCheckMemoryUsage(): - self.show_memory_usage = False + if self.should_store_memory_usage and not CanCheckMemoryUsage(): + self.should_store_memory_usage = False if _MEMORY_MEASURE_ERROR is not None: print(_MEMORY_MEASURE_ERROR, file=sstm.stderr) _MEMORY_MEASURE_ERROR = None @@ -64,85 +65,45 @@ class handler_extension_t: if 0 < self.message_width < 5: self.message_width = 5 if formatter is None: - message_format = MessageFormat(self.show_where, self.show_memory_usage) - formatter = lggg.Formatter(fmt=message_format, datefmt=TIME_FORMAT) - handler.setFormatter(formatter) - self.FormattedRecord = handler.formatter.format + self.MessageFromRecord = self._MessageFromRecord + else: + handler.setFormatter(formatter) + self.MessageFromRecord = handler.formatter.format - def FormattedLines( + def _MessageFromRecord( self, record: lggg.LogRecord, /, *, PreProcessed: h.Callable[[str], str] | None = None, - should_join_lines: bool = False, - ) -> tuple[str, str | None]: + ) -> str: """ See logger_36.catalog.handler.README.txt. """ - record.level_first_letter = record.levelname[0] - message = record.msg - if not isinstance(message, str): - message = str(message) - original_message = message if PreProcessed is not None: message = PreProcessed(message) - if (has_newlines := ("\n" in message)) or ( - (self.message_width > 0) and (message.__len__() > self.message_width) - ): - if has_newlines: - lines = message.splitlines() - if self.message_width > 0: - lines = _WrappedLines(lines, self.message_width) - else: - lines = _WrappedLines([message], self.message_width) - next_lines = NEXT_LINE_PROLOGUE.join(lines[1:]) - next_lines = f"{NEXT_LINE_PROLOGUE}{next_lines}" - message = lines[0] + if (self.message_width <= 0) or (message.__len__() <= self.message_width): + if "\n" in message: + message = NEXT_LINE_PROLOGUE.join(message.splitlines()) else: - next_lines = None - if self.message_width > 0: - n_missing_s = self.message_width - message.__len__() - if n_missing_s > 3: - message += " " + (n_missing_s - 1) * "." - elif n_missing_s > 0: - message += n_missing_s * " " - - record.msg = message - if self.show_where and not hasattr(record, SHOW_WHERE_ATTR): - hide_where = getattr(record, HIDE_WHERE_ATTR, False) - if hide_where: - record.where = "" + if "\n" in message: + lines = _WrappedLines(message.splitlines(), self.message_width) else: - module = path_t(record.pathname) - path_was_found = False - for path in sstm.path: - if module.is_relative_to(path): - module = module.relative_to(path) - path_was_found = True - break - if path_was_found: - module = str(module.parent / module.stem) - module = module.replace(FOLDER_SEPARATOR, ".") - else: - module = record.module - record.where = WHERE_FORMAT.format( - module=module, funcName=record.funcName, lineno=record.lineno - ) - first_line = self.FormattedRecord(record).replace("\t", " ") - - # Revert the record message to its original value for subsequent handlers. - record.msg = original_message + lines = _WrappedLines([message], self.message_width) + message = NEXT_LINE_PROLOGUE.join(lines) - if should_join_lines: - if next_lines is None: - return first_line, None - else: - return f"{first_line}{next_lines}", None + if (where := getattr(record, "where", None)) is None: + where = "" else: - return first_line, next_lines + where = f"{NEXT_LINE_PROLOGUE}{WHERE_SEPARATOR} {where}" + + return ( + f"{record.when_or_elapsed}" + f"{LEVEL_OPENING}{record.level_first_letter}{LEVEL_CLOSING} " + f"{MESSAGE_MARKER} {message}{where}" + ) def _WrappedLines(lines: list[str], message_width: int, /) -> list[str]: diff --git a/package/logger_36/type/issue.py b/package/logger_36/type/issue.py index 3decba6ab9f7084dfc6bc331a9da46aca1317d95..e93328a960fccf66a7cc9ef79459fd1cac8c9ac2 100644 --- a/package/logger_36/type/issue.py +++ b/package/logger_36/type/issue.py @@ -11,7 +11,7 @@ from logger_36.config.issue import ISSUE_BASE_CONTEXT from logger_36.constant.generic import NOT_PASSED from logger_36.constant.issue import ISSUE_LEVEL_SEPARATOR from logger_36.constant.message import expected_op_h -from logger_36.task.format.message import FormattedMessage +from logger_36.task.format.message import MessageWithActualExpected issue_t = str @@ -32,7 +32,7 @@ def NewIssue( """""" if context.__len__() == 0: context = ISSUE_BASE_CONTEXT - message = FormattedMessage( + message = MessageWithActualExpected( message, actual=actual, expected=expected, diff --git a/package/logger_36/type/logger.py b/package/logger_36/type/logger.py index f0a9da89d63657d3fcdf11bcc24369f60746f3cb..7d8ae2ec03fafd0d14f25aff237e1dedf3c1ccb1 100644 --- a/package/logger_36/type/logger.py +++ b/package/logger_36/type/logger.py @@ -10,35 +10,47 @@ import sys as sstm import traceback as tcbk import types as t import typing as h -from datetime import datetime as dttm +from datetime import date as date_t +from datetime import datetime as date_time_t +from os import sep as FOLDER_SEPARATOR from pathlib import Path as path_t from traceback import TracebackException as traceback_t from logger_36.config.issue import ISSUE_CONTEXT_END, ISSUE_CONTEXT_SEPARATOR -from logger_36.config.message import DATE_FORMAT +from logger_36.config.message import ( + DATE_FORMAT, + ELAPSED_TIME_SEPARATOR, + LONG_ENOUGH, + TIME_FORMAT, +) from logger_36.constant.generic import NOT_PASSED from logger_36.constant.issue import ISSUE_LEVEL_SEPARATOR, ORDER, order_h from logger_36.constant.logger import ( - HIDE_WHERE_KWARG, LOGGER_NAME, WARNING_LOGGER_NAME, WARNING_TYPE_COMPILED_PATTERN, logger_handle_h, ) from logger_36.constant.memory import UNKNOWN_MEMORY_USAGE -from logger_36.constant.message import expected_op_h -from logger_36.constant.record import SHOW_MEMORY_ATTR, SHOW_W_RULE_ATTR -from logger_36.task.format.memory import ( - FormattedUsageWithAutoUnit as FormattedMemoryUsage, +from logger_36.constant.message import TIME_LENGTH_m_1, expected_op_h +from logger_36.constant.record import ( + HIDE_WHERE_ATTR, + SHOW_W_RULE_ATTR, + STORE_MEMORY_ATTR, ) -from logger_36.task.format.message import FormattedMessage +from logger_36.task.format.message import MessageWithActualExpected from logger_36.task.measure.chronos import ElapsedTime from logger_36.task.measure.memory import CurrentUsage as CurrentMemoryUsage from logger_36.type.issue import NewIssue, issue_t +logger_base_t = lggg.Logger + +_DATE_TIME_ORIGIN = date_time_t.fromtimestamp(1970, None) +_DATE_ORIGIN = _DATE_TIME_ORIGIN.date() + @d.dataclass(slots=True, repr=False, eq=False) -class logger_t(lggg.Logger): +class logger_t(logger_base_t): name_: d.InitVar[str] = LOGGER_NAME level_: d.InitVar[int] = lggg.NOTSET activate_wrn_interceptions: d.InitVar[bool] = True @@ -50,8 +62,9 @@ class logger_t(lggg.Logger): on_hold: list[lggg.LogRecord] = d.field(init=False, default_factory=list) events: dict[int, int] = d.field(init=False, default_factory=dict) - last_message_date: str = d.field(init=False, default="") - any_handler_shows_memory: bool = d.field(init=False, default=False) + last_message_now: date_time_t = d.field(init=False, default=_DATE_TIME_ORIGIN) + last_message_date: date_t = d.field(init=False, default=_DATE_ORIGIN) + any_handler_stores_memory: bool = d.field(init=False, default=False) memory_usages: list[tuple[str, int]] = d.field(init=False, default_factory=list) context_levels: list[str] = d.field(init=False, default_factory=list) staged_issues: list[issue_t] = d.field(init=False, default_factory=list) @@ -64,9 +77,9 @@ class logger_t(lggg.Logger): self, name_: str, level_: int, activate_wrn_interceptions: bool ) -> None: """""" - lggg.Logger.__init__(self, name_) + logger_base_t.__init__(self, name_) self.setLevel(level_) - self.propagate = False # Part of lggg.Logger. + self.propagate = False # Part of logger_base_t. for level in lggg.getLevelNamesMapping().values(): self.events[level] = 0 @@ -92,7 +105,7 @@ class logger_t(lggg.Logger): logger.handle = t.MethodType(_HandleForWarnings(self), logger) lggg.captureWarnings(True) - self.info("Warning Interception: ON", **HIDE_WHERE_KWARG) + self.info("Warning Interception: ON") def _DeactivateWarningInterceptions(self) -> None: """""" @@ -102,7 +115,7 @@ class logger_t(lggg.Logger): self.intercepted_wrn_handle = None lggg.captureWarnings(False) - self.info("Warning Interception: OFF", **HIDE_WHERE_KWARG) + self.info("Warning Interception: OFF") def ToggleWarningInterceptions(self, state: bool, /) -> None: """""" @@ -130,16 +143,13 @@ class logger_t(lggg.Logger): intercepted = sorted(self.intercepted_log_handles.keys()) if intercepted.__len__() > 0: as_str = ", ".join(intercepted) - self.info( - f"Now Intercepting LOGs from: {as_str}", - **HIDE_WHERE_KWARG, - ) + self.info(f"Now Intercepting LOGs from: {as_str}") elif self.intercepted_log_handles.__len__() > 0: for name, handle in self.intercepted_log_handles.items(): logger = lggg.getLogger(name) logger.handle = handle self.intercepted_log_handles.clear() - self.info("Log Interception: OFF", **HIDE_WHERE_KWARG) + self.info("Log Interception: OFF") @property def max_memory_usage(self) -> int: @@ -162,15 +172,15 @@ class logger_t(lggg.Logger): def AddHandler(self, handler: lggg.Handler, should_hold_messages: bool, /) -> None: """""" self.should_hold_messages = should_hold_messages - lggg.Logger.addHandler(self, handler) + logger_base_t.addHandler(self, handler) extension = getattr(handler, "extension", None) if extension is None: - show_memory_usage = False + should_store_memory_usage = False else: - show_memory_usage = getattr(extension, SHOW_MEMORY_ATTR, False) - if show_memory_usage: - self.any_handler_shows_memory = True + should_store_memory_usage = getattr(extension, STORE_MEMORY_ATTR, False) + if should_store_memory_usage: + self.any_handler_stores_memory = True extension = getattr(handler, "extension", handler.name) if isinstance(extension, str): @@ -180,51 +190,75 @@ class logger_t(lggg.Logger): self.info( f'New handler "{name}" with class "{type(handler).__name__}" and ' f"level {lggg.getLevelName(handler.level)}", - **HIDE_WHERE_KWARG, ) def handle(self, record: lggg.LogRecord, /) -> None: """""" - if (not self.should_hold_messages) and (self.on_hold.__len__() > 0): - for hold in self.on_hold: - lggg.Logger.handle(self, hold) - self.on_hold.clear() - - record.elapsed_time = ElapsedTime() + elapsed_time, now = ElapsedTime(should_return_now=True) - if self.any_handler_shows_memory or not self.hasHandlers(): - # Memory usage is also added if there are no handlers yet, just in case. - usage = CurrentMemoryUsage() - self.memory_usages.append( - (f"{record.module}.{record.funcName}.{record.lineno}", usage) - ) - - value, unit = FormattedMemoryUsage(usage, 1) - record.memory_usage = f"{value}{unit}" + if (self.on_hold.__len__() > 0) and not self.should_hold_messages: + for held in self.on_hold: + logger_base_t.handle(self, held) + self.on_hold.clear() - date = dttm.now().strftime(DATE_FORMAT) - if date != self.last_message_date: + if (date := now.date()) != self.last_message_date: self.last_message_date = date # levelno: Added for management by logging.Logger.handle. date_record = lggg.makeLogRecord( { "name": self.name, "levelno": lggg.INFO, - "msg": f"DATE: {date}", + "msg": f"DATE: {date.strftime(DATE_FORMAT)}", SHOW_W_RULE_ATTR: True, } ) if self.should_hold_messages: self.on_hold.append(date_record) else: - lggg.Logger.handle(self, date_record) + logger_base_t.handle(self, date_record) + + # When. + if now - self.last_message_now > LONG_ENOUGH: + record.when_or_elapsed = now.strftime(TIME_FORMAT) + else: + record.when_or_elapsed = ( + f"{ELAPSED_TIME_SEPARATOR}{elapsed_time:.<{TIME_LENGTH_m_1}}" + ) + self.last_message_now = now + + # Where. + # Memory usage is also stored if there are no handlers yet, just in case. + should_store_where = self.any_handler_stores_memory or not self.hasHandlers() + should_show_where = (record.levelno != lggg.INFO) and not hasattr( + record, HIDE_WHERE_ATTR + ) + if should_store_where or should_show_where: + module = path_t(record.pathname) + for path in sstm.path: + if module.is_relative_to(path): + module = module.relative_to(path).with_suffix("") + module = str(module).replace(FOLDER_SEPARATOR, ".") + break + else: + module = record.module + where = f"{module}:{record.funcName}:{record.lineno}" + if should_show_where: + record.where = where + else: + where = None + + # How. + record.level_first_letter = record.levelname[0] + + # What. + if not isinstance(record.msg, str): + record.msg = str(record.msg) if self.should_hold_messages: self.on_hold.append(record) else: - lggg.Logger.handle(self, record) + logger_base_t.handle(self, record) - self.events[record.levelno] += 1 if (self.exit_on_critical and (record.levelno is lggg.CRITICAL)) or ( self.exit_on_error and (record.levelno is lggg.ERROR) ): @@ -232,6 +266,11 @@ class logger_t(lggg.Logger): # __post_init__ set self.exit_on_critical if self.exit_on_error. sstm.exit(1) + self.events[record.levelno] += 1 + + if should_store_where: + self.memory_usages.append((where, CurrentMemoryUsage())) + def Log( self, message: str, @@ -247,7 +286,7 @@ class logger_t(lggg.Logger): """""" if isinstance(level, str): level = lggg.getLevelNamesMapping()[level.upper()] - message = FormattedMessage( + message = MessageWithActualExpected( message, actual=actual, expected=expected, @@ -357,7 +396,7 @@ class logger_t(lggg.Logger): if order not in ORDER: raise ValueError( - FormattedMessage( + MessageWithActualExpected( "Invalid commit order", actual=order, expected=f"One of {str(ORDER)[1:-1]}", @@ -379,17 +418,18 @@ class logger_t(lggg.Logger): formatted = "\n".join(lines) """ + hide_where = {HIDE_WHERE_ATTR: None} if unified: level, _ = issues[0].split(ISSUE_LEVEL_SEPARATOR, maxsplit=1) wo_level = [] for issue in issues: _, issue = issue.split(ISSUE_LEVEL_SEPARATOR, maxsplit=1) wo_level.append(issue) - self.log(int(level), "\n".join(wo_level), stacklevel=2) + self.log(int(level), "\n".join(wo_level), stacklevel=2, extra=hide_where) else: for issue in issues: level, issue = issue.split(ISSUE_LEVEL_SEPARATOR, maxsplit=1) - self.log(int(level), issue, stacklevel=2) + self.log(int(level), issue, stacklevel=2, extra=hide_where) self.staged_issues.clear() def __enter__(self) -> None: @@ -408,10 +448,10 @@ class logger_t(lggg.Logger): return False -def _HandleForWarnings(interceptor: lggg.Logger, /) -> logger_handle_h: +def _HandleForWarnings(interceptor: logger_base_t, /) -> logger_handle_h: """""" - def handle_p(_: lggg.Logger, record: lggg.LogRecord, /) -> None: + def handle_p(_: logger_base_t, record: lggg.LogRecord, /) -> None: pieces = WARNING_TYPE_COMPILED_PATTERN.match(record.msg) if pieces is None: # The warning message does not follow the default format. @@ -437,11 +477,11 @@ def _HandleForWarnings(interceptor: lggg.Logger, /) -> logger_handle_h: def _HandleForInterceptions( - intercepted: lggg.Logger, interceptor: lggg.Logger, / + intercepted: logger_base_t, interceptor: logger_base_t, / ) -> logger_handle_h: """""" - def handle_p(_: lggg.Logger, record: lggg.LogRecord, /) -> None: + def handle_p(_: logger_base_t, record: lggg.LogRecord, /) -> None: duplicate = lggg.makeLogRecord(record.__dict__) duplicate.msg = f"{record.msg} :{intercepted.name}:" interceptor.handle(duplicate) diff --git a/package/logger_36/version.py b/package/logger_36/version.py index caafadc7a17be50ad3997769abf18aec945d6dbe..a5156b48b9109b0599c961e5540c0c46190b3796 100644 --- a/package/logger_36/version.py +++ b/package/logger_36/version.py @@ -4,7 +4,7 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023 SEE COPYRIGHT NOTICE BELOW """ -__version__ = "2024.28" +__version__ = "2024.29" """ COPYRIGHT NOTICE diff --git a/test/main.py b/test/main.py index bdcfaeeddbf0509e1c7d89ece214bd8572764f7d..9650bf48419ce1c127ccd2bfd68360cf3ee6320d 100644 --- a/test/main.py +++ b/test/main.py @@ -52,7 +52,7 @@ with TemporaryDirectory() as tmp_folder: AddRichConsoleHandler( level=lggg.DEBUG, - show_memory_usage=True, + should_store_memory_usage=True, should_hold_messages=True, should_record=True, alternating_lines=1, @@ -62,7 +62,7 @@ with TemporaryDirectory() as tmp_folder: message_width=80, should_hold_messages=True, ) - AddFileHandler(tmp_file, show_memory_usage=True) # Level=lggg.INFO. + AddFileHandler(tmp_file, should_store_memory_usage=True) # Level=lggg.INFO. LOGGER.ToggleLogInterceptions(True) LogSystemDetails()