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



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

tldr,

我设法将特定级别的日志显示在其各自的文件中,但是

  • debug.log包含所有日志级消息

  • info.log包含所有日志级消息,离开调试

  • 警告log包含警告,错误&关键日志级消息

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

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

所以,我遵循官方https://docs.djangoproject.com/en/2.2/topics/logging/

从此DJANGO REST框架中获得了更清晰的图片,在不同的文件上记录了不同的级别

然后编写以下代码。

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

信息2019-05-02 05:36:22,888自动加载1683 4558792128观看使用StatReloader的文件更改 错误2019-05-02 05:36:26,604 GetQuestions 1683 123145336807424错误! 调试2019-05-02 05:36:26,604 GetQuestions 1683 123145336807424调试 信息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 Critical

info.log

信息2019-05-02 05:36:22,888自动加载1683 4558792128观看使用StatReloader的文件更改 错误2019-05-02 05:36:26,604 GetQuestions 1683 123145336807424错误! 信息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 Critical

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 Critical

error.log

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

crialical.log

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

正如您在问题中提到的那样,DEBUG包含所有日志级消息,INFO已包含所有日志级消息,除了DEBUG等。这就是日志级别的工作方式,DEBUG是最高级别,而CRITICAL是最低的。因此,调试将包含所有其他日志级消息,关键将获得一条。可以在Python文档中找到更多信息

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

我建议维护特定的Django应用程序。因此,Django应用程序中的所有日志都将在一个单个Logger文件中。但这取决于您应该如何设置记录器的应用程序体系结构/必要性。

最后,即使您想在不同文件中获得不同级别的日志,也需要配置不同的记录仪,例如:

'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")

最新更新