将不同日志级别的消息过滤到不同的日志文件
Filter Different log level messages to different log files
所以,我正在尝试为我的 Django 项目创建一个日志系统,我需要将所有不同的日志级别消息保存到不同的文件中。
TLDR,
我设法让特定级别的日志出现在各自的文件中,但是
Debug.log包含所有日志级别消息
Info.log 包含所有离开 debug
的日志级别消息
warning.log 包含 WARN、ERROR 和 CRITICAL 日志级别消息
error.log 包含 ERROR & CRITICAL 日志级别消息
critical.log 仅包含 CRITICAL 日志级别消息
于是,我关注了官方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")
所以,我正在尝试为我的 Django 项目创建一个日志系统,我需要将所有不同的日志级别消息保存到不同的文件中。
TLDR,
我设法让特定级别的日志出现在各自的文件中,但是
Debug.log包含所有日志级别消息
Info.log 包含所有离开 debug
的日志级别消息
warning.log 包含 WARN、ERROR 和 CRITICAL 日志级别消息
error.log 包含 ERROR & CRITICAL 日志级别消息
critical.log 仅包含 CRITICAL 日志级别消息
于是,我关注了官方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")