From 1d05f9d4d77c5f18d409847240cfdbe2a1f316a4 Mon Sep 17 00:00:00 2001 From: shenjack <3695888@qq.com> Date: Mon, 23 Oct 2023 23:41:22 +0800 Subject: [PATCH] some logger --- libs/lib_not_dr/logger/formatter.py | 49 +++++++++++++++++++++++------ libs/lib_not_dr/logger/structers.py | 7 ++++- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/libs/lib_not_dr/logger/formatter.py b/libs/lib_not_dr/logger/formatter.py index feec071..4941e5f 100644 --- a/libs/lib_not_dr/logger/formatter.py +++ b/libs/lib_not_dr/logger/formatter.py @@ -7,24 +7,25 @@ import time from string import Template -from typing import List +from typing import List, Tuple, Dict, Union, Optional from lib_not_dr.types.options import Options -from structers import LogMessage +from structers import LogMessage, FormattingMessage class BaseFormatter(Options): name = 'BaseFormatter' sub_formatter: List['BaseFormatter'] = [] + default_template: str = '${log_time} ${logger_name} ${logger_tag} ${level} ${messages}' @classmethod def add_info(cls, match: str, to: str, description: str) -> str: - return f'- {{{to}}} -> {match} : {description}' + return f'- {to} -> ${{{match}}} : {description}' @classmethod def info(cls) -> str: - cache = f"##{cls.name}\n" + cache = f"## {cls.name}\n" cache += cls._info() for formatter in cls.sub_formatter: cache += formatter.info() @@ -34,10 +35,30 @@ class BaseFormatter(Options): def _info(cls) -> str: return '' - def format(self, message: LogMessage) -> str: - raise NotImplementedError(f'{self.__class__.__name__}.format is not implemented') + def format_message(self, + message: LogMessage, + template: Optional[Union[Template, str]] = None) -> str: + """ + Format message + :param message: 输入的消息 + :param template: 日志输出模板 + :return: + """ + basic_info = message.option() + if basic_info[''] + message, info = self._format((message, message.option())) - def _format(self, message: LogMessage) -> LogMessage: + if template is None: + template = Template(self.default_template) + elif isinstance(template, str): + template = Template(template) + + try: + return template.substitute(**info) + except KeyError: + return template.safe_substitute(**info) + + def _format(self, message: FormattingMessage) -> FormattingMessage: """ Format message :param message: @@ -59,5 +80,15 @@ class TimeFormatter(BaseFormatter): return cls.add_info('log_time', 'formatted time when logging', 'The time format string' '. See https://docs.python.org/3/library/time.html#time.strftime for more information.') - def format(self, message: LogMessage) -> str: - return f'[{message.log_time}]' + def _format(self, message: FormattingMessage) -> FormattingMessage: + time_mark = time.localtime(message[0].log_time / 1000000000) + if self.msec_time_format: + time_mark = self.msec_time_format.format(time.strftime(self.time_format, time_mark), + message[0].create_msec_3) + message[1]['log_time'] = time_mark + return message + + +if __name__ == '__main__': + print(TimeFormatter.info()) + print(TimeFormatter().format_message(LogMessage())) diff --git a/libs/lib_not_dr/logger/structers.py b/libs/lib_not_dr/logger/structers.py index ecf680a..7d9c567 100644 --- a/libs/lib_not_dr/logger/structers.py +++ b/libs/lib_not_dr/logger/structers.py @@ -7,10 +7,13 @@ import time from types import FrameType -from typing import List, Optional +from typing import List, Optional, Tuple, Dict from lib_not_dr.types.options import Options +__all__ = ['LogMessage', + 'FormattingMessage'] + class LogMessage(Options): name = 'LogMessage' @@ -37,3 +40,5 @@ class LogMessage(Options): def create_msec_3(self) -> int: return int(self.log_time / 1000000) % 1000 + +FormattingMessage = Tuple[LogMessage, Dict[str, str]]