import logging from logging.handlers import TimedRotatingFileHandler import asyncio import time import os # 确保 logs 目录存在 def ensure_logs_directory(): logs_dir = "logs" if not os.path.exists(logs_dir): os.makedirs(logs_dir) return logs_dir # 配置日志 def setup_logger(name, log_file, level=logging.INFO): # 确保 logs 目录存在 ensure_logs_directory() # 构建完整的日志文件路径 logs_dir = "logs" full_log_path = os.path.join(logs_dir, log_file) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 创建按时间轮转的文件处理器 handler = TimedRotatingFileHandler( full_log_path, # 使用完整路径 when="midnight", # 每天午夜轮转 interval=1, # 间隔1天 backupCount=30 # 保留30天的日志 ) handler.setFormatter(formatter) logger = logging.getLogger(name) logger.setLevel(level) # 避免重复添加 handler if not logger.handlers: logger.addHandler(handler) return logger # 创建全局logger实例 logger = setup_logger('hik3d', 'app.log') def get_logger(): """ 获取全局logger实例 """ return logger # 异步写入日志的包装函数 async def async_log(logger, level, message): # 在线程池中执行日志写入,避免阻塞事件循环 loop = asyncio.get_event_loop() await loop.run_in_executor(None, getattr(logger, level), message) # # 使用示例 # logger = setup_logger('my_app', 'app.log') # 运行 # asyncio.run(main())