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

Filter Different log level messages to different log files

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

TLDR,

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

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

这张图看得更清楚了

然后写了下面的代码

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 Watching for file changes with StatReloader ERROR 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 error! DEBUG 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 debug INFO 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 info WARNING 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 warning CRITICAL 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 critical

info.log

INFO 2019-05-02 05:36:22,888 autoreload 1683 4558792128 Watching for file changes with StatReloader ERROR 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 error! INFO 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 info WARNING 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 warning CRITICAL 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 critical

warn.log

ERROR 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 error! WARNING 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 warning CRITICAL 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 critical

error.log

ERROR 2019-05-02 05:36:26,604 getQuestions 1683 123145336807424 error! CRITICAL 2019-05-02 05:36:26,605 getQuestions 1683 123145336807424 critical

critical.log

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

正如您在问题中提到的,DEBUG 包含所有日志级别消息,INFO 包含除 DEBUG 之外的所有日志级别消息,依此类推。这就是日志级别的工作原理,DEBUG 是最高级别,CRITICAL 是最低级别。所以 DEBUG 将包含所有其他日志级别的消息,而 CRITICAL 将包含一个。可以在 Python Documentation

中找到更多信息

老实说,为不同的日志级别设置不同的文件并不是一个好的设计。因为当你在代码中写入日志时,它会维护一个执行顺序。有了这些顺序日志,你应该能够掌握代码是如何执行的,以及为什么最终会出现错误。有很多工具可以从包含不同级别日志的单个文件中解析错误日志,例如,Kibana or ELK. You can use Sentry 也可以跟踪错误日志。

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

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

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