You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
|
7 months ago
|
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())
|