Files
hot-news-api/app/utils/logger.py
2026-03-26 15:04:59 +08:00

73 lines
2.2 KiB
Python

import logging
import os
import sys
import time
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
import pytz
from datetime import datetime
from app.core.config import get_logging_config
# 获取日志配置
log_config = get_logging_config()
# 确保日志目录存在
os.makedirs(log_config.dir, exist_ok=True)
# 自定义日志格式化器,使用配置的时区
class CustomFormatter(logging.Formatter):
def converter(self, timestamp):
dt = datetime.fromtimestamp(timestamp)
tz = pytz.timezone(log_config.timezone)
return dt.replace(tzinfo=pytz.utc).astimezone(tz)
def formatTime(self, record, datefmt=None):
dt = self.converter(record.created)
if datefmt:
return dt.strftime(datefmt)
return dt.strftime("%Y-%m-%d %H:%M:%S")
# 创建日志记录器
log = logging.getLogger('app')
log.setLevel(getattr(logging, log_config.level))
# 清除现有处理器
for handler in log.handlers[:]:
log.removeHandler(handler)
# 创建控制台处理器
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(getattr(logging, log_config.level))
console_formatter = CustomFormatter(log_config.format)
console_handler.setFormatter(console_formatter)
log.addHandler(console_handler)
# 创建文件处理器 - 按大小轮转
file_handler = RotatingFileHandler(
os.path.join(log_config.dir, log_config.file),
maxBytes=log_config.max_size,
backupCount=log_config.backup_count,
encoding='utf-8'
)
file_handler.setLevel(getattr(logging, log_config.level))
file_formatter = CustomFormatter(log_config.format)
file_handler.setFormatter(file_formatter)
log.addHandler(file_handler)
# 创建文件处理器 - 按日期轮转
daily_handler = TimedRotatingFileHandler(
os.path.join(log_config.dir, 'app.daily.log'),
when='midnight',
interval=1,
backupCount=log_config.daily_backup_count,
encoding='utf-8'
)
daily_handler.setLevel(getattr(logging, log_config.level))
daily_handler.setFormatter(file_formatter)
log.addHandler(daily_handler)
# 防止日志传播到父记录器
log.propagate = False
# 记录启动信息
log.info(f"Logger initialized at {datetime.now(pytz.timezone(log_config.timezone)).strftime('%Y-%m-%d %H:%M:%S')}")