Python 日志配置详解:使用 RotatingFileHandler 和 TimedRotatingFileHandler

config = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'default': {
            'format': ' %(asctime)s - %(name)s - %(levelname)s - %(message)s',
            'datefmt': "%Y/%m/%d %H:%M:%S"
        }
    },
    'handlers': {
        'rotatingHandler': {
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': logfile,
            'maxBytes': 2*1024*1024,
            'backupCount': 3,
            'formatter': 'default',
            'encoding': 'utf-8'
        },
        'timedHandler': {
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': logfile,
            'when': 'midnight',
            'interval': 1,
            'backupCount': 7,
            'formatter': 'default',
            'encoding': 'utf-8'
        },
    },
    'loggers': {
        'celery': {
            'handlers': ['timedHandler'],
            'level': loglevel_str,
            'propagate': False
        },
    },
    'root': {
        'handlers': ['rotatingHandler'],
        'level': loglevel_str,
        'propagate': False
    },
}

logging.config.dictConfig(config)

1. 配置概述

以上配置通过字典方式定义了日志系统的各个组成部分,包括版本、格式化器、处理器、日志器等。最终通过 logging.config.dictConfig(config) 方法应用该配置。

1.1 版本与现有日志器

  • version: 配置的版本号,这里设置为 1,表示使用当前版本的配置格式。
  • disable_existing_loggers: 是否禁用现有的日志器。设置为 False,表示保留已存在的日志器配置。

2. 格式化器(Formatter)

格式化器定义了日志输出的格式。

'formatters': {
    'default': {
        'format': ' %(asctime)s - %(name)s - %(levelname)s - %(message)s',
        'datefmt': "%Y/%m/%d %H:%M:%S"
    }
},
  • default: 名称为 default 的格式化器。
    • format: 定义日志条目的格式,包括时间、日志器名称、日志级别和消息内容。
    • datefmt: 定义时间的格式,这里设置为 YYYY/MM/DD HH:MM:SS

3. 处理器(Handler)

处理器负责将日志记录输出到不同的目的地,如文件、终端等。本文配置中使用了两种文件处理器:RotatingFileHandlerTimedRotatingFileHandler

3.1 RotatingFileHandler

'rotatingHandler': {
    'class': 'logging.handlers.RotatingFileHandler',
    'filename': logfile,
    'maxBytes': 2*1024*1024,
    'backupCount': 3,
    'formatter': 'default',
    'encoding': 'utf-8'
},
  • class: 指定处理器的类,这里为 RotatingFileHandler
  • filename: 日志文件的名称,变量 logfile 需预先定义。
  • maxBytes: 单个日志文件的最大字节数,超过后进行轮转。此处设置为 2MB。
  • backupCount: 保留的备份文件数量,设置为 3,意味着会保留最新的三个备份文件。
  • formatter: 使用之前定义的 default 格式化器。
  • encoding: 文件编码方式,设置为 utf-8

工作原理:当日志文件大小超过 maxBytes 时,RotatingFileHandler 会自动将当前日志文件重命名为备份文件,同时新日志继续写入原文件名,最多保留 backupCount 个备份。

3.2 TimedRotatingFileHandler

'timedHandler': {
    'class': 'logging.handlers.TimedRotatingFileHandler',
    'filename': logfile,
    'when': 'midnight',
    'interval': 1,
    'backupCount': 7,
    'formatter': 'default',
    'encoding': 'utf-8'
},
  • class: 指定处理器的类,这里为 TimedRotatingFileHandler
  • filename: 日志文件的名称,变量 logfile 需预先定义。
  • when: 指定时间轮转的单位,这里设置为 midnight,即每天午夜进行日志轮转。
  • interval: 轮转的间隔次数,与 when 结合。例如,when='midnight'interval=1 表示每天轮转一次。
  • backupCount: 保留的备份文件数量,设置为 7,意味着会保留最近七天的日志备份。
  • formatter: 使用之前定义的 default 格式化器。
  • encoding: 文件编码方式,设置为 utf-8

工作原理TimedRotatingFileHandler 根据时间间隔自动轮转日志文件。比如上述配置每天午夜创建一个新的日志文件,旧日志根据 backupCount 保留七天。

4. 日志器(Logger)

日志器是日志系统的核心,负责接收日志消息并将其传递给相应的处理器。

4.1 Celery 日志器

'loggers': {
    'celery': {
        'handlers': ['timedHandler'],
        'level': loglevel_str,
        'propagate': False
    },
},
  • celery: 名称为 celery 的日志器,通常用于 Celery 任务队列的日志记录。
    • handlers: 该日志器使用 timedHandler,即按时间轮转的处理器。
    • level: 日志级别,由变量 loglevel_str 决定(如 DEBUG, INFO 等)。
    • propagate: 设置为 False,表示日志不会向上级日志器传播,避免重复记录。

4.2 根日志器(Root Logger)

'root': {
    'handlers': ['rotatingHandler'],
    'level': loglevel_str,
    'propagate': False
},
  • root: 根日志器,适用于所有未明确指定的日志记录。
    • handlers: 使用 rotatingHandler,即按大小轮转的处理器。
    • level: 日志级别,同样由 loglevel_str 决定。
    • propagate: 设置为 False,避免日志向上级传播。

5. 应用配置

最后,通过以下代码将配置应用于日志系统:

logging.config.dictConfig(config)

这行代码解析上述字典配置,并初始化日志系统,使其按照定义的格式、处理器和日志器进行日志记录。

6. 配置优势与适用场景

6.1 RotatingFileHandler 的优势

  • 控制日志文件大小:通过设置 maxBytes,防止日志文件过大,占用过多磁盘空间。
  • 自动备份:通过 backupCount,自动管理备份文件,确保最新日志的可追溯性。

适用场景:适用于日志量较大且需要根据文件大小进行管理的应用,如高频请求的 Web 服务。

6.2 TimedRotatingFileHandler 的优势

  • 基于时间轮转:按照时间间隔(如每天、每小时)进行日志轮转,便于按时间查找日志。
  • 自动备份:通过 backupCount,自动保留指定时间范围内的日志。

适用场景:适用于需要按时间段整理日志的应用,如定时任务、每日数据分析等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值