杰瑞科技汇

Python logging 如何实现多文件日志记录?

Python Logging 多文件配置指南

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

Python logging 如何实现多文件日志记录?-图1
(图片来源网络,侵删)

使用多个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('错误信息')

最佳实践建议

  1. 使用RotatingFileHandler:避免日志文件过大,自动分割日志文件
  2. 分级记录:不同级别的日志记录到不同文件
  3. 配置集中化:使用字典配置便于管理复杂日志配置
  4. 考虑性能:在高频日志场景下,考虑使用QueueHandler和QueueListener
  5. 环境区分:开发环境和生产环境使用不同的日志配置

方法可以根据实际需求选择或组合使用,实现灵活的多文件日志记录功能。

Python logging 如何实现多文件日志记录?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇