128 lines
4.0 KiB
Python
128 lines
4.0 KiB
Python
import logging
|
|
import logging.handlers
|
|
import os
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
def setup_logging():
|
|
"""配置日志系统"""
|
|
# 创建logs目录
|
|
log_dir = Path("logs")
|
|
log_dir.mkdir(exist_ok=True)
|
|
|
|
# 配置根日志记录器
|
|
root_logger = logging.getLogger()
|
|
root_logger.setLevel(logging.INFO)
|
|
|
|
# 清除现有的处理器
|
|
for handler in root_logger.handlers[:]:
|
|
root_logger.removeHandler(handler)
|
|
|
|
# 创建格式化器
|
|
formatter = logging.Formatter(
|
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S'
|
|
)
|
|
|
|
# 1. 控制台处理器
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setLevel(logging.INFO)
|
|
console_handler.setFormatter(formatter)
|
|
root_logger.addHandler(console_handler)
|
|
|
|
# 2. 应用日志文件处理器(按日期滚动)
|
|
app_log_file = log_dir / "app.log"
|
|
app_handler = logging.handlers.TimedRotatingFileHandler(
|
|
app_log_file,
|
|
when='midnight',
|
|
interval=1,
|
|
backupCount=30,
|
|
encoding='utf-8'
|
|
)
|
|
app_handler.setLevel(logging.INFO)
|
|
app_handler.setFormatter(formatter)
|
|
root_logger.addHandler(app_handler)
|
|
|
|
# 3. 错误日志文件处理器
|
|
error_log_file = log_dir / "error.log"
|
|
error_handler = logging.handlers.TimedRotatingFileHandler(
|
|
error_log_file,
|
|
when='midnight',
|
|
interval=1,
|
|
backupCount=30,
|
|
encoding='utf-8'
|
|
)
|
|
error_handler.setLevel(logging.ERROR)
|
|
error_handler.setFormatter(formatter)
|
|
root_logger.addHandler(error_handler)
|
|
|
|
# 4. 任务调度器专用日志处理器
|
|
scheduler_log_file = log_dir / "scheduler.log"
|
|
scheduler_handler = logging.handlers.TimedRotatingFileHandler(
|
|
scheduler_log_file,
|
|
when='midnight',
|
|
interval=1,
|
|
backupCount=30,
|
|
encoding='utf-8'
|
|
)
|
|
scheduler_handler.setLevel(logging.INFO)
|
|
scheduler_handler.setFormatter(formatter)
|
|
|
|
# 为调度器设置专用logger
|
|
scheduler_logger = logging.getLogger('apscheduler')
|
|
scheduler_logger.addHandler(scheduler_handler)
|
|
scheduler_logger.setLevel(logging.INFO)
|
|
|
|
# 为应用调度器模块设置专用logger
|
|
app_scheduler_logger = logging.getLogger('app.utils.scheduler')
|
|
app_scheduler_logger.addHandler(scheduler_handler)
|
|
app_scheduler_logger.setLevel(logging.INFO)
|
|
|
|
# 5. API访问日志处理器
|
|
access_log_file = log_dir / "access.log"
|
|
access_handler = logging.handlers.TimedRotatingFileHandler(
|
|
access_log_file,
|
|
when='midnight',
|
|
interval=1,
|
|
backupCount=30,
|
|
encoding='utf-8'
|
|
)
|
|
access_formatter = logging.Formatter(
|
|
'%(asctime)s - %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S'
|
|
)
|
|
access_handler.setFormatter(access_formatter)
|
|
|
|
# 为uvicorn访问日志设置处理器
|
|
uvicorn_access_logger = logging.getLogger("uvicorn.access")
|
|
uvicorn_access_logger.addHandler(access_handler)
|
|
uvicorn_access_logger.setLevel(logging.INFO)
|
|
|
|
# 6. 数据库日志处理器
|
|
db_log_file = log_dir / "database.log"
|
|
db_handler = logging.handlers.TimedRotatingFileHandler(
|
|
db_log_file,
|
|
when='midnight',
|
|
interval=1,
|
|
backupCount=30,
|
|
encoding='utf-8'
|
|
)
|
|
db_handler.setLevel(logging.INFO)
|
|
db_handler.setFormatter(formatter)
|
|
|
|
# 为SQLAlchemy设置日志
|
|
sqlalchemy_logger = logging.getLogger('sqlalchemy.engine')
|
|
sqlalchemy_logger.addHandler(db_handler)
|
|
sqlalchemy_logger.setLevel(logging.WARNING) # 只记录警告和错误
|
|
|
|
print(f"日志系统已配置,日志文件保存在: {log_dir.absolute()}")
|
|
print("日志文件:")
|
|
print(f" - 应用日志: {app_log_file}")
|
|
print(f" - 错误日志: {error_log_file}")
|
|
print(f" - 调度器日志: {scheduler_log_file}")
|
|
print(f" - 访问日志: {access_log_file}")
|
|
print(f" - 数据库日志: {db_log_file}")
|
|
|
|
def get_logger(name: str = None):
|
|
"""获取日志记录器"""
|
|
return logging.getLogger(name or __name__) |