如何覆盖另一个库中的现有记录器?

时间:2018-10-27 18:37:42

标签: python logging tornado

我正在将Python的Tornado库用于我的Web服务,我希望从我的代码以及从Tornado创建的每个日志都采用json格式。我试过在根记录器上设置格式化程序,并设置格式化程序和所有其他记录器。这是我目前试图开始工作的黑客。在我看来,它似乎应该可以工作...但是,当我运行该应用程序时,来自Tornado的所有日志仍保持其标准格式。

import logging

from tornado.log import access_log, app_log, gen_log
import logmatic


loggers = [
    logging.getLogger(),
    logging.getLogger('tornado.access'),
    logging.getLogger('tornado.application'),
    logging.getLogger('tornado.general'),
    access_log,
    gen_log,
    app_log
]
json_formatter = logmatic.JsonFormatter()
for logger in loggers:
    for hand in logger.handlers:
        hand.setFormatter(json_formatter)

logging.getLogger('tornado.access').warning('All the things')
# WARNING:tornado.access (172.26.0.6) 0.47ms
# NOT JSON???

注意::当我将服务logging.getLogger('myservice')的记录器包括在loggers列表中并运行该记录器时,他们执行以获取更新的格式化程序并吐出json。这排除了logmatic格式器的问题。无法使格式化程序适用于Tornado记录器。

1 个答案:

答案 0 :(得分:1)

龙卷风的记录器在calling loop.start()之前没有任何处理程序,因此您应该向记录器添加具有预定义格式的处理程序。

formatter = logging.Formatter(...)
handler = logging.StreamHandler()
handler.setFormatter(formatter)

for l in loggers:
    l.setLevel(logging.WARNING)
    l.addHandler(handler)