"""
日志系统模块
使用 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="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {message}",
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"]