update log

This commit is contained in:
2026-06-06 16:04:33 +08:00
parent 29b6118f11
commit 8a9d9a5c78

View File

@@ -1,51 +1,44 @@
# log.py
import os
from datetime import datetime
import logging
from logging.handlers import RotatingFileHandler
import inspect # 新增导入
from PubLibrary.InifileHelper import IniRead
console_output = IniRead('system', 'console_output', '1')
log_level = IniRead('system', 'algo_log_level', 'INFO')
# 新增日志去重缓存key为日志内容value为是否已打印
log_once_cache = set()
# 缓存已经创建过的logger避免重复创建handler
logger_cache = {}
def init_module_logger():
"""
初始化指定模块的日志器
:return: 对应模块的logger实例
"""
# 缓存命中则直接返回
log_dir = './logs/' # 确保日志目录存在
def init_module_logger(logger_name):
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)
log_file = os.path.join(log_dir, f'algo_log_{datetime.now().strftime("%Y-%m-%d")}.log')
# 初始化logger
logger = logging.getLogger('decoderLogger')
# 已创建直接返回
if logger_name in logger_cache:
return logger_cache[logger_name]
logger = logging.getLogger(logger_name)
logger.setLevel(log_level)
if logger.handlers:
return logger
logger_cache[logger_name] = logger
return logger
# 设置日志轮转最大10个文件每个10MB
file_handler = RotatingFileHandler(
log_file,
maxBytes=10*1024*1024,
backupCount=10,
encoding='utf-8'
)
# 日志格式
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
file_handler.setFormatter(formatter)
logger.setLevel(log_level)
logger.addHandler(file_handler)
if console_output:
@@ -53,27 +46,26 @@ def init_module_logger():
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger_cache[logger_name] = logger
return logger
def algo_log(content, level="INFO", record_once=False):
"""
通用日志函数,支持按模块输出到不同日志文件
:param content: 日志内容
:param level: 日志级别DEBUG/INFO/WARNING/ERROR/FATAL
:param record_once: 是否只打印一次该日志内容默认False
"""
# 初始化模块日志器
logger = init_module_logger()
# 新增:处理只打印一次的逻辑
def algo_log(content, level="INFO", record_once=False):
# 向上回溯1层栈拿到调用algo_log的代码文件信息
frame = inspect.currentframe().f_back
file_path = frame.f_code.co_filename
# 提取py文件名不带后缀/带后缀自选)
file_name = os.path.basename(file_path) # 例zmqServer.py
# file_name = os.path.splitext(os.path.basename(file_path))[0] # 例zmqServer
logger = init_module_logger(file_name)
if record_once:
# 生成唯一标识可根据需要调整比如拼接level增强唯一性
log_key = f"{level.upper()}_{content}"
if log_key in log_once_cache:
return # 已打印过,直接返回
log_once_cache.add(log_key) # 未打印过,加入缓存
return
log_once_cache.add(log_key)
# 根据级别输出日志
level_upper = level.upper()
if level_upper == "DEBUG":
logger.debug(content)
@@ -83,5 +75,5 @@ def algo_log(content, level="INFO", record_once=False):
logger.error(content)
elif level_upper == "FATAL":
logger.fatal(content)
else: # 默认INFO级别
else:
logger.info(content)