Files
banban/talkingq-url/utils/logger.py
2026-03-24 15:04:36 +08:00

93 lines
2.8 KiB
Python

import os
from typing import Optional
from loguru import logger
class SessionLogger:
def __init__(self):
self.is_main_process = os.environ.get("UVICORN_WID", "0") == "0"
# 创建日志目录
os.makedirs("logs", exist_ok=True)
# 配置loguru
logger.remove() # 移除默认handler
# 控制台输出
logger.add(
lambda msg: print(msg, end=""),
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> - <level>{level}</level> - [设备: {extra[device_id]}] [会话: {extra[session_id]}] {message}",
level="INFO"
)
# 文件输出 - 持久化保存
logger.add(
"logs/talkingq_{time:YYYY-MM-DD}.log",
format="{time:YYYY-MM-DD HH:mm:ss} - {level} - [设备: {extra[device_id]}] [会话: {extra[session_id]}] {message}",
rotation="00:00", # 每天轮转
retention="30 days", # 保留30天
compression="zip", # 压缩旧日志
level="INFO"
)
self.logger = logger
def log(
self,
level: str,
device_id: Optional[str],
session_id: Optional[str],
message: str,
**kwargs
):
if isinstance(device_id, str) and device_id.startswith("{"):
try:
import json
device_info = json.loads(device_id)
device_id = device_info.get("device_id", device_id)
except:
pass # 如果解析失败,保持原样
# 绑定额外信息到logger
bound_logger = self.logger.bind(
device_id=device_id or "unknown",
session_id=session_id or "unknown"
)
# 根据level调用对应方法
if level.upper() == "INFO":
bound_logger.info(message)
elif level.upper() == "ERROR":
bound_logger.error(message)
elif level.upper() == "WARNING":
bound_logger.warning(message)
else:
bound_logger.log(level, message)
def system_log(self, level: str, session_id: str, message: str):
if self.is_main_process:
self.log(level, "system", session_id, message)
def info(self, device_id: Optional[str], session_id: Optional[str], message: str):
self.log("INFO", device_id, session_id, message)
def system_info(self, session_id: str, message: str):
self.system_log("INFO", session_id, message)
def error(
self,
device_id: Optional[str],
session_id: Optional[str],
message: str,
**kwargs
):
self.log("ERROR", device_id, session_id, message, **kwargs)
def warning(
self, device_id: Optional[str], session_id: Optional[str], message: str
):
self.log("WARNING", device_id, session_id, message)
session_logger = SessionLogger()