【问题标题】:Filter Different log level messages to different log files将不同的日志级别消息过滤到不同的日志文件
【发布时间】:2019-09-20 14:54:53
【问题描述】:

所以,我正在尝试为我的 Django 项目创建一个日志系统,我需要将所有不同的日志级别消息保存到不同的文件中。

TLDR,

我设法让特定级别的日志出现在各自的文件中,但是

  • Debug.log 包含所有日志级别的消息

  • Info.log 包含所有离开调试的日志级别消息

  • warning.log 包含 WARN、ERROR 和 CRITICAL 日志级别消息

  • error.log 包含 ERROR & CRITICAL 日志级别消息

  • critical.log 仅包含 CRITICAL 日志级别消息

所以,我关注了官方https://docs.djangoproject.com/en/2.2/topics/logging/

Django rest framework logging different levels on different files得到更清晰的图片

然后写了如下代码。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'debug_logs': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'logs/debug.log',
            'formatter': 'verbose',
        },
        'error_logs': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': 'logs/error.log',
            'formatter': 'verbose',
        },
        'warn_logs': {
            'level': 'WARN',
            'class': 'logging.FileHandler',
            'filename': 'logs/warn.log',
            'formatter': 'verbose',
        },
        'info_logs': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': 'logs/info.log',
            'formatter': 'verbose',
        },
        'critical_logs': {
            'level': 'CRITICAL',
            'class': 'logging.FileHandler',
            'filename': 'logs/critical.log',
            'formatter': 'verbose',
        },

    },
    'loggers': {
        '': {
            'handlers': ['error_logs', 'warn_logs', 'info_logs', 'critical_logs', 'debug_logs'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

所以,现在我得到的结果如下,

debug.log

INFO 2019-05-02 05:36:22,888 autoreload 1683 4558792128 使用 StatReloader 监视文件更改 错误 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 错误! 调试 2019-05-02 05:36:26,604 获取问题 1683 123145336807424 调试 信息 2019-05-02 05:36:26,604 获取问题 1683 123145336807424 信息 警告 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 警告 关键 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 关键

info.log

INFO 2019-05-02 05:36:22,888 autoreload 1683 4558792128 使用 StatReloader 监视文件更改 错误 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 错误! 信息 2019-05-02 05:36:26,604 获取问题 1683 123145336807424 信息 警告 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 警告 关键 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 关键

warn.log

ERROR 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 错误! 警告 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 警告 关键 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 关键

error.log

ERROR 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 错误! 关键 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 关键

critical.log

关键 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 关键

【问题讨论】:

    标签: python django django-logging python-logging


    【解决方案1】:

    正如您在问题中提到的,DEBUG 包含所有日志级别消息,INFO 包含除DEBUG 之外的所有日志级别消息等。这就是日志级别的工作原理,DEBUG 是最高级别,CRITICAL 是最低级别。所以 DEBUG 将包含所有其他日志级别的消息,而 CRITICAL 将得到一个。更多信息请关注Python Documentation

    说实话,为不同的日志级别提供不同的文件并不是一个好的设计。因为当你在你的代码中写日志时,它会保持一个执行顺序。有了这些顺序日志,您应该能够掌握代码是如何执行的,以及错误最终发生的原因。有许多工具可以从包含不同级别日志的单个文件中解析错误日志,例如,Kibana or ELK。您也可以使用Sentry 来跟踪错误日志。

    我建议维护 Django 应用程序特定的记录器。因此,来自 Django 应用程序的所有日志都将位于一个记录器文件中。但如何设置记录器取决于您的应用程序架构/必要性。

    最后,即使你想在不同的文件中获取不同级别的日志,你也需要配置不同的记录器,像这样:

    'loggers': {
        'error_logger': {
            'handlers': ['error_logs'],
            'level': 'DEBUG',
            'propagate': True,
        },
       'warn_logger': {
            'handlers': ['warn_logs'],
            'level': 'WARN',
            'propagate': True,
        }
        # in same way configure info_logs, debug_logs and so on.
    }
    

    然后在您的文件中,您需要像这样导入记录器:

    info_logger = logging.getLogger('info_logger')
    error_logger = logging.getLogger('error_logger')
    
    #inside code
    info_logger.info("some info")
    error_logger.error("error")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-25
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2017-08-24
      相关资源
      最近更新 更多