chatmlTest / utils /logger.py
fangshengren's picture
Upload 59 files
f4fac26 verified
import logging
from os.path import dirname, abspath
import os
import colorlog
import time
from config import PROJECT_ROOT
# 自定义日志格式
class Logger(object):
def __init__(self, logger_name: str, level=logging.DEBUG, std_out: bool=True, save2file: bool=False, file_name: str=None) ->None:
super().__init__()
if std_out == False and save2file == False:
raise ValueError('args: [std_out, save2file], at less one of them must be True')
# 默认的格式化
datefmt = "%Y-%m-%d %H:%M:%S"
# 输出到控制台
if std_out:
std_logfmt = "[%(asctime)s.%(msecs)03d] [%(levelname)s]: %(log_color)s%(message)s"
self.stdout_logger = logging.getLogger('{}_std'.format(logger_name))
self.stdout_logger.setLevel(level)
# 彩色输出格式化
log_colors_config = {
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red'
}
formatter = colorlog.ColoredFormatter(
fmt=std_logfmt,
datefmt=datefmt,
log_colors=log_colors_config,
)
sh = logging.StreamHandler()
sh.setLevel(level)
sh.setFormatter(formatter)
self.stdout_logger.addHandler(sh)
# 输出到文件
if save2file:
file_logfmt = "[%(asctime)s.%(msecs)03d] [%(levelname)s]: %(message)s"
self.file_logger = logging.getLogger('{}_file'.format(logger_name))
self.file_logger.setLevel(level)
base_dir = PROJECT_ROOT + '/logs' # 获取上级目录的绝对路径
if not os.path.exists(base_dir):
os.mkdir(base_dir)
log_file = ''
if file_name is not None:
log_file = file_name
else:
log_file = base_dir + '/' + logger_name + '-' + str(time.strftime('%Y%m%d', time.localtime())) +'.log'
fh = logging.FileHandler(filename=log_file, mode='a', encoding='utf-8')
fh.setLevel(level)
save_formatter = logging.Formatter(
fmt=file_logfmt,
datefmt=datefmt,
)
fh.setFormatter(save_formatter)
self.file_logger.addHandler(fh)
def info(self, message: str, std_out: bool=True, save_to_file: bool=False) -> None:
if std_out:
self.stdout_logger.info(message)
if save_to_file:
self.file_logger.info(message)
def debug(self, message: str, std_out: bool=True, save_to_file: bool=False) -> None:
if std_out:
self.stdout_logger.debug(message)
if save_to_file:
self.file_logger.debug(message)
def warning(self, message: str, std_out: bool=True, save_to_file: bool=False) -> None:
if std_out:
self.stdout_logger.warning(message)
if save_to_file:
self.file_logger.warning(message)
def error(self, message: str, std_out: bool=True, save_to_file: bool=False) -> None:
if std_out:
self.stdout_logger.error(message)
if save_to_file:
self.file_logger.error(message)
if __name__ == "__main__":
log = Logger('test', std_out=True, save2file=True, file_name='../logs/test.log')
# log = Logger('test', save2file=True)
log.info('test info')
log.info('test file log', save_to_file=True)