我在我的Django www.example.com文件中使用了以下日志片段settings.py。如下图所示,所有日志都被捕获了两次。
我之所以保留root对象,是因为我想logger.info在控制台和日志文件中捕获www.example.com()
设置.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '[%(asctime)s] %(levelname)s|%(name)s|%(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S',
},
},
'handlers': {
'applogfile': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'django_blend.log'),
'backupCount': 10,
'formatter': 'simple',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
}
},
'root': { # this tells to capture logger.info() to console as well as in log file
'handlers': ['console', 'applogfile'],
'level': 'INFO',
},
'loggers': {
'django': {
'handlers': ['applogfile', 'console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
}
}
}
django.log文件
3条答案
按热度按时间n9vozmp41#
我在Django 3.2.7中测试了你的代码,如果移除根对象,它可以正常工作,并且你也没有重复的行。
eqqqjvef2#
添加“传播”:假伐木工。
e1xvtsh33#
值得仔细阅读logging.Logger.propagate文档。它对传播机制提供了非常清晰的解释。其中还有一个注解:
注:如果您将处理程序附加到记录器及其一个或多个祖先,它可能会多次发出同一条记录。通常,您不需要将处理程序附加到多个记录器-如果您仅将其附加到记录器层次结构中最高的相应记录器,则它将看到所有后代记录器记录的所有事件。一种常见的情况是只将处理程序附加到根记录器,而让传播处理其余的事务。
(my着重号)
OP的示例中有
root
和django
记录器的重复处理程序,因此从django
记录器中删除重复的处理程序应该是可行的。如果您需要特定模块的特定处理程序,您可以显式添加它们并在其中设置
propagate=False
,如here所述。