# logger.py import logging.handlers import os import sys from logging.handlers import TimedRotatingFileHandler def process_log_data(data, head=50, tail=50): """处理日志数据,将 'picture' 键的值截断,其他键保持原样""" processed = {} for k, v in data.items(): if isinstance(v, str): # 如果字符串太长,进行截断显示 if len(v) > head + tail: processed[k] = v[:head] + "..." + v[-tail:] else: processed[k] = v else: processed[k] = v return processed # 确保日志目录存在 log_dir = 'logs' if not os.path.exists(log_dir): os.makedirs(log_dir) # 实例化并导出全局日志记录器 logger = logging.getLogger("casic_algo_server_logger") logger.setLevel(logging.DEBUG) # 设置日志级别 # 创建一个TimedRotatingFileHandler handler = TimedRotatingFileHandler( os.path.join(log_dir, 'app.log'), # 日志文件名 when='midnight', # 每天午夜滚动 interval=1 # 滚动间隔为1天 ) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) # 将handler添加到日志器 logger.addHandler(handler) # 创建控制台处理器 utf8_stream = open(sys.__stdout__.fileno(), mode='w', encoding='utf-8', buffering=1) console_handler = logging.StreamHandler(utf8_stream) console_handler.setLevel(logging.DEBUG) console_handler.setFormatter(formatter) logger.addHandler(console_handler) # 将标准输出和标准错误重定向到日志记录器 class StreamToLogger: def __init__(self, logger, level): self.logger = logger self.level = level def write(self, message): if message.strip(): # 忽略空消息 self.logger.log(self.level, message) def flush(self): pass # 这里不需要实现 # 捕获所有stdout和stderr的内容到日志 sys.stdout = StreamToLogger(logger, logging.INFO) sys.stderr = StreamToLogger(logger, logging.ERROR)