Files
autoPlus/utils/logger.py
2026-01-26 15:04:02 +08:00

113 lines
2.8 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.
"""
日志系统模块
使用 loguru 提供彩色日志输出和文件记录功能
- 彩色控制台输出
- 按账号创建独立日志文件
- 敏感信息脱敏(邮箱、密码)
"""
from loguru import logger
import sys
import time
from pathlib import Path
import re
def mask_sensitive_data(text: str) -> str:
"""
脱敏处理敏感信息
- 邮箱保留前2位和@后的域名,中间用***代替
- 密码:完全替换为 ********
"""
# 邮箱脱敏: user@example.com -> us***@example.com
text = re.sub(
r'\b([a-zA-Z0-9]{1,2})[a-zA-Z0-9._-]*@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})\b',
r'\1***@\2',
text
)
# 密码脱敏: password=abc123 -> password=********
text = re.sub(
r'(password["\']?\s*[:=]\s*["\']?)([^"\'\s,}]+)(["\']?)',
r'\1********\3',
text,
flags=re.IGNORECASE
)
return text
def setup_logger(log_level: str = "INFO"):
"""
配置全局日志系统
参数:
log_level: 日志级别 (DEBUG, INFO, WARNING, ERROR)
"""
# 移除默认处理器
logger.remove()
# 添加彩色控制台输出
logger.add(
sys.stderr,
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <level>{message}</level>",
colorize=True,
level=log_level,
filter=lambda record: mask_sensitive_data(str(record["message"]))
)
# 确保 logs 目录存在
Path("logs").mkdir(exist_ok=True)
# 添加通用日志文件(所有账号的汇总日志)
logger.add(
"logs/app_{time:YYYY-MM-DD}.log",
rotation="00:00", # 每天凌晨轮转
retention="7 days", # 保留7天
compression="zip", # 压缩旧日志
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {message}",
level="DEBUG", # 文件记录所有级别
enqueue=True # 异步写入
)
logger.info("Logger initialized")
def setup_account_logger(email: str) -> str:
"""
为特定账号创建独立日志文件
参数:
email: 注册邮箱
返回:
日志文件路径
"""
# 文件名安全处理:替换特殊字符
safe_email = email.replace("@", "_").replace(".", "_")
timestamp = int(time.time())
log_path = f"logs/account_{safe_email}_{timestamp}.log"
# 添加账号专属日志文件
logger.add(
log_path,
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {message}",
level="DEBUG",
rotation="10 MB",
retention="30 days",
filter=lambda record: email in str(record["message"]) # 只记录相关日志
)
logger.info(f"Account logger created: {log_path}")
return log_path
# 初始化默认配置
setup_logger()
# 导出主要接口
__all__ = ["logger", "setup_logger", "setup_account_logger", "mask_sensitive_data"]