将不同的日志级别消息过滤到不同的日志文件

时间:2019-05-02 06:02:05

标签: python django django-logging python-logging

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

TLDR,

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

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

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

  • warning.log包含警告,错误和严重的日志级别消息

  • error.log包含错误和关键日志级别消息

  • critical.log仅包含关键的日志级别消息

所以,我遵循了官方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自动重新加载1683 4558792128使用StatReloader查看文件更改   错误2019-05-02 05:36:26,604 getQuestions 1683 123145336807424错误!   DEBUG 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424调试   INFO 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关键

info.log

  

INFO 2019-05-02 05:36:22,888自动重新加载1683 4558792128使用StatReloader查看文件更改   错误2019-05-02 05:36:26,604 getQuestions 1683 123145336807424错误!   INFO 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关键

warn.log

  

错误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

  

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

critical.log

  

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

1 个答案:

答案 0 :(得分: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")