Python Logging 多文件配置指南
在Python中实现多文件日志记录可以通过多种方式实现,以下是几种常见的方法:

使用多个FileHandler
import logging
from logging.handlers import RotatingFileHandler
# 创建主日志记录器
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 创建错误日志文件处理器
error_handler = RotatingFileHandler('error.log', maxBytes=1024*1024, backupCount=5)
error_handler.setLevel(logging.ERROR)
# 创建普通日志文件处理器
info_handler = RotatingFileHandler('info.log', maxBytes=1024*1024, backupCount=5)
info_handler.setLevel(logging.INFO)
# 创建格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
error_handler.setFormatter(formatter)
info_handler.setFormatter(formatter)
# 添加处理器到日志记录器
logger.addHandler(console_handler)
logger.addHandler(error_handler)
logger.addHandler(info_handler)
# 测试日志
logger.debug('这是一条调试信息') # 只会出现在控制台
logger.info('这是一条普通信息') # 会出现在info.log和控制台
logger.error('这是一条错误信息') # 会出现在error.log、info.log和控制台
使用子日志记录器
import logging
# 配置根日志记录器
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('app.log'),
logging.StreamHandler()
]
)
# 创建子日志记录器
db_logger = logging.getLogger('app.database')
api_logger = logging.getLogger('app.api')
# 测试日志
db_logger.info('数据库操作记录')
api_logger.error('API调用失败')
使用TimedRotatingFileHandler按时间分割日志
import logging
from logging.handlers import TimedRotatingFileHandler
# 创建日志记录器
logger = logging.getLogger('timed_logger')
logger.setLevel(logging.DEBUG)
# 创建按天分割的日志处理器
daily_handler = TimedRotatingFileHandler(
'app.log',
when='midnight',
interval=1,
backupCount=7
)
daily_handler.setLevel(logging.INFO)
# 创建错误日志处理器
error_handler = logging.FileHandler('error.log')
error_handler.setLevel(logging.ERROR)
# 设置格式化器
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
daily_handler.setFormatter(formatter)
error_handler.setFormatter(formatter)
# 添加处理器
logger.addHandler(daily_handler)
logger.addHandler(error_handler)
# 测试日志
logger.info('这是一条普通信息')
logger.error('这是一条错误信息')
使用字典配置(推荐)
import logging
import logging.config
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'standard',
'stream': 'ext://sys.stdout'
},
'info_file': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'INFO',
'formatter': 'standard',
'filename': 'info.log',
'maxBytes': 10485760,
'backupCount': 5,
'encoding': 'utf8'
},
'error_file': {
'class': 'logging.handlers.RotatingFileHandler',
'level': 'ERROR',
'formatter': 'standard',
'filename': 'error.log',
'maxBytes': 10485760,
'backupCount': 5,
'encoding': 'utf8'
}
},
'loggers': {
'': {
'handlers': ['console', 'info_file', 'error_file'],
'level': 'DEBUG',
'propagate': True
}
}
}
# 应用配置
logging.config.dictConfig(LOGGING_CONFIG)
# 获取日志记录器
logger = logging.getLogger(__name__)
# 测试日志
logger.debug('调试信息')
logger.info('普通信息')
logger.error('错误信息')
最佳实践建议
- 使用RotatingFileHandler:避免日志文件过大,自动分割日志文件
- 分级记录:不同级别的日志记录到不同文件
- 配置集中化:使用字典配置便于管理复杂日志配置
- 考虑性能:在高频日志场景下,考虑使用QueueHandler和QueueListener
- 环境区分:开发环境和生产环境使用不同的日志配置
方法可以根据实际需求选择或组合使用,实现灵活的多文件日志记录功能。

