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)
处理器负责将日志记录输出到不同的目的地,如文件、终端等。本文配置中使用了两种文件处理器:RotatingFileHandler
和 TimedRotatingFileHandler
。
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
,自动保留指定时间范围内的日志。
适用场景:适用于需要按时间段整理日志的应用,如定时任务、每日数据分析等。