使用pythonFaust
,我所有的日志都翻倍了。
由于记录器是分层的,我想防止下游记录器father.son
记录任何内容,并将所有日志传播到上游father
记录器。
我试着:
1 -当调用main时,将dictConfig
中的disable_existing_loggers
设置为True
2 -使用dictConfig
:
class LogPreventingFilter(logging.Filter):
def filter(self, record):
return False
logging_config = {
'version': 1,
'disable_existing_loggers': True,
'filters': {
'log_preventing_filter': {
'()': LogPreventingFilter
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'filters': ['log_preventing_filter']
}
},
'loggers': {
'father.son': {
'level': 'DEBUG',
'handlers': ['console']
}
}
}
dictConfig(logging_config)
3 -添加相同的logging_config到faust的应用程序配置logging_config
(有和没有'disable_existing_loggers': True
) -在这种情况下,我可以看到日志记录器我提到的(father.son
),但不是从father
,即使我添加了father
记录器到faust配置),也不是日志从任何其他非层次记录器(如getLogger("some_name_not_related_to_father")
)。
我会提到,我试图删除过滤器和处理程序,但它没有做出任何改变。
值得一提的是,只有在我调用faust的app.main()
之后,日志才开始翻倍。
还值得一提的是,我想实际记录数据的记录器都来自导入的模块,而不是faust可见的代码的一部分。只有father.son
日志记录器。
我代码:
some.imported.module
father_logger = logging.getLogger("father")
some_other_logger = logging.getLogger("not_hierarchiali_related")
class MyGenericClass:
// add filters and handlers and do some generic stuff
stream_processing_module
son_logger = logging.getLogger("father.son")
async def processing_function():
// do some stuff
son_logger.info("log this and that")
模块使用faust:
son_logger = logging.getLogger("father.son")
@app.agent
async def stream_processing():
// call the processing_function() for the other module for each record
son_logger.info("log some data")
if __name__ == "main":
son_logger.info("start")
with MyGenericClass:
app.main()
注意只有son_logger
对faust是可见的。但是,我希望父日志记录器执行打印,而不是子日志记录器。
任何想法?谢谢!
我在Faust
日志手册中发现,应用程序写入独立的root_logger
(在python应用程序上调用logging.getLogger()
时无法获得它),并且必须在启动faust应用程序(app.main()
)之前在应用程序配置(logging_config
)中设置至少一个处理程序。如果你没有设置根日志记录器,Faust会为你做,并且可能会在python应用上下文中打印日志,并在Faust应用上下文中打印相同的日志。