Django日志配置异常排查及日志按大小分割实现咨询
Django日志配置修复与日志分割实现
问题原因分析
- 多级别日志混入问题:Python logging的handler默认会处理自身级别及更高等级的日志(INFO < WARNING < ERROR < CRITICAL)。你的
info_file设置了level='INFO',所以会自动接收INFO、WARNING、ERROR级别的日志,导致文件中混入非INFO级别的内容。 - warning_file未生成:大概率是你尚未触发过WARNING级别的日志,或者日志未被正确路由到该handler(修复过滤配置后,触发WARNING日志即可生成文件)。
修复后的完整LOGGING配置
首先在settings.py顶部导入logging模块:
import logging
然后修改LOGGING配置,添加级别过滤规则并替换为支持分割的handler:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '{asctime} | {threadName}({thread}) [{levelname}] {message} ({name} {module}:{lineno})', 'style': '{', }, 'simple': { 'format': '{asctime} [{levelname}] {message} ({name}:{lineno})', 'datefmt': '%H:%M:%S', 'style': '{', }, }, # 添加级别过滤规则,确保每个handler只处理对应级别日志 'filters': { 'only_info': { '()': 'django.utils.log.CallbackFilter', 'callback': lambda record: record.levelno == logging.INFO, }, 'only_warning': { '()': 'django.utils.log.CallbackFilter', 'callback': lambda record: record.levelno == logging.WARNING, }, 'only_error': { '()': 'django.utils.log.CallbackFilter', 'callback': lambda record: record.levelno == logging.ERROR, }, }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'verbose', }, # 替换为RotatingFileHandler实现按大小分割日志 'all_logs': { 'class': 'logging.handlers.RotatingFileHandler', 'filename': str(BASE_DIR.joinpath('log', 'all.log')), 'formatter': 'verbose', 'maxBytes': 1024 * 1024 * 5, # 单个日志文件最大5MB 'backupCount': 5, # 最多保留5个备份文件 }, 'error_file': { 'level': 'ERROR', 'class': 'logging.handlers.RotatingFileHandler', 'filename': str(BASE_DIR.joinpath('log', 'error.log')), 'formatter': 'verbose', 'filters': ['only_error'], # 仅保留ERROR级别日志 'maxBytes': 1024 * 1024 * 5, 'backupCount': 3, }, 'warning_file': { 'level': 'WARNING', 'class': 'logging.handlers.RotatingFileHandler', 'filename': str(BASE_DIR.joinpath('log', 'warning.log')), 'formatter': 'verbose', 'filters': ['only_warning'], # 仅保留WARNING级别日志 'maxBytes': 1024 * 1024 * 5, 'backupCount': 3, }, 'info_file': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', 'filename': str(BASE_DIR.joinpath('log', 'info.log')), 'formatter': 'verbose', 'filters': ['only_info'], # 仅保留INFO级别日志 'maxBytes': 1024 * 1024 * 5, 'backupCount': 3, }, }, 'loggers': { 'django': { 'handlers': ['all_logs', 'console', 'error_file', 'warning_file', 'info_file'], 'propagate': False, }, 'applications': { 'handlers': ['all_logs', 'console', 'error_file', 'warning_file', 'info_file'], 'propagate': False, }, }, }
关键配置说明
- 级别过滤:通过
django.utils.log.CallbackFilter自定义过滤规则,每个handler只保留对应级别的日志(比如only_info过滤出levelno等于logging.INFO的记录)。 - 日志分割:使用
RotatingFileHandler替代原有的FileHandler,核心参数:maxBytes:单个日志文件的最大字节数(示例为5MB)backupCount:最多保留的备份文件数量(超过后自动删除最旧的备份)
如果你需要按时间分割日志,可以替换为logging.handlers.TimedRotatingFileHandler,添加when(分割时间单位,如'H'表示小时、'D'表示天)和interval(间隔数)参数。
测试验证
在你的应用中触发不同级别的日志,验证每个文件是否只包含对应级别的内容:
import logging logger = logging.getLogger('applications') logger.info('这是一条INFO级日志') logger.warning('这是一条WARNING级日志') logger.error('这是一条ERROR级日志')
内容的提问来源于stack exchange,提问作者Ruslan
相关产品推荐
相关产品推荐

