因此,我正在尝试为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关键
答案 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")