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