Files
bci_algo/logs/log.py
2026-06-06 16:04:33 +08:00

79 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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')
log_once_cache = set()
# 缓存已经创建过的logger避免重复创建handler
logger_cache = {}
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')
# 已创建直接返回
if logger_name in logger_cache:
return logger_cache[logger_name]
logger = logging.getLogger(logger_name)
logger.setLevel(log_level)
if logger.handlers:
logger_cache[logger_name] = logger
return logger
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.addHandler(file_handler)
if console_output:
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger_cache[logger_name] = logger
return 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:
log_key = f"{level.upper()}_{content}"
if log_key in log_once_cache:
return
log_once_cache.add(log_key)
level_upper = level.upper()
if level_upper == "DEBUG":
logger.debug(content)
elif level_upper == "WARNING":
logger.warning(content)
elif level_upper == "ERROR":
logger.error(content)
elif level_upper == "FATAL":
logger.fatal(content)
else:
logger.info(content)