lib-not-dr/lib_not_dr/logger/formatter.py

95 lines
2.9 KiB
Python
Raw Normal View History

2023-10-23 23:40:36 +08:00
# -------------------------------
# Difficult Rocket
# Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com
# All rights reserved
# -------------------------------
import time
from string import Template
from typing import List, Tuple, Dict, Union, Optional
from lib_not_dr.types.options import Options
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}'
@classmethod
def info(cls) -> str:
cache = f"## {cls.name}\n"
cache += cls._info()
for formatter in cls.sub_formatter:
cache += formatter.info()
return cache
@classmethod
def _info(cls) -> str:
return ''
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()))
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:
:return:
"""
for formatter in self.sub_formatter:
message = formatter._format(message)
return message
class TimeFormatter(BaseFormatter):
name = 'TimeFormatter'
time_format: str = '%Y-%m-%d %H:%M:%S'
msec_time_format: str = '{}-{:03d}'
@classmethod
def _info(cls) -> str:
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: 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()))