You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django日志配置异常排查及日志按大小分割实现咨询

Django日志配置修复与日志分割实现

问题原因分析

  1. 多级别日志混入问题:Python logging的handler默认会处理自身级别及更高等级的日志(INFO < WARNING < ERROR < CRITICAL)。你的info_file设置了level='INFO',所以会自动接收INFO、WARNING、ERROR级别的日志,导致文件中混入非INFO级别的内容。
  2. 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,
        },
    },
}

关键配置说明

  1. 级别过滤:通过django.utils.log.CallbackFilter自定义过滤规则,每个handler只保留对应级别的日志(比如only_info过滤出levelno等于logging.INFO的记录)。
  2. 日志分割:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:05:22