我遇到了Django Loggers的一个奇怪行为。
我正在使用Django开发一个前端应用程序。在登录服务期间,我向某些组件发出一些请求,并使用log.warning((调用来查看请求流。
日志工作得很好,直到我决定添加一个LOGGING配置来在文件中打印日志的输出,因为我想通过Docker部署应用程序,并且我想定期检查日志文件。
当我添加以下关于日志的Django配置时:
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'detailed': {
'class': 'logging.Formatter',
'format': "[%(asctime)s] - [%(name)s:%(lineno)s] - [%(levelname)s] %(message)s",
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'detailed',
},
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'filename': "{}/am.log".format(BASE_DIR),
'mode': 'w',
'formatter': 'detailed',
'level': 'INFO',
'maxBytes': 2024 * 2024,
'backupCount': 5,
},
},
'loggers': {
'am': {
'level': 'INFO',
'handlers': ['console', 'file']
},
}
}
日志记录停止工作。日志记录配置中指定的文件am.log确实已创建,但没有任何内容打印到该文件中。甚至控制台日志记录也不会发生。
我从我的一个Django项目中获得了这个日志记录配置,用于这个应用程序的后端,在那里它可以完美地工作。我真的不明白我做错了什么。你能帮助我或指引我朝正确的方向走吗。我将不胜感激。
祝大家今天过得愉快!
通过在'loggers'
配置中使用键"am",您定义了一个名为"am"的记录器:
'loggers': {
'am': { # <-- name of the logger
'level': 'INFO',
'handlers': ['console', 'file']
},
}
因此,要使用该记录器,您必须使用该名称:
logger = logging.getLogger("am")
logger.warning("This is a warning")
如果你用你正在运行的模块的名称来命名你的记录器,这是推荐的做法,那么你需要定义每个模块记录器:
logger = logging.getLogger(__name__) # <-- this logger will be named after the module, e.g. your app name.
然后在您的日志配置中,您可以指定每个模块(每个应用程序(的日志行为:
'loggers': {
'my_app': { # <-- logging for my app
'level': 'INFO',
'handlers': ['console', 'file']
},
'django': { # <-- logging for Django module
'level': 'WARNING',
'handlers': ['console', 'file']
},
}
或者,如果您只想记录所有内容,请使用根(''
(记录器,它没有名称,只是空字符串:
'loggers': {
'': { # <-- root logger
'level': 'INFO',
'handlers': ['console', 'file']
},
}