如何覆盖另一个库中的现有记录器?
How do I override an existing logger in another library?
我正在为我的网络服务使用 Python 的 Tornado 库,我希望从我的代码和 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???
注意: 当我在 loggers
列表中包含我的服务 logging.getLogger('myservice')
的记录器并且 运行 他们 do 获取更新的格式化程序并吐出 json。这排除了 logmatic
格式化程序的问题。无法让格式化程序为 Tornado 记录器工作。
Tornado 的记录器在 calling loop.start() 之前没有任何处理程序,因此您应该向记录器添加一个具有预定义格式的处理程序。
formatter = logging.Formatter(...)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
for l in loggers:
l.setLevel(logging.WARNING)
l.addHandler(handler)
我正在为我的网络服务使用 Python 的 Tornado 库,我希望从我的代码和 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???
注意: 当我在 loggers
列表中包含我的服务 logging.getLogger('myservice')
的记录器并且 运行 他们 do 获取更新的格式化程序并吐出 json。这排除了 logmatic
格式化程序的问题。无法让格式化程序为 Tornado 记录器工作。
Tornado 的记录器在 calling loop.start() 之前没有任何处理程序,因此您应该向记录器添加一个具有预定义格式的处理程序。
formatter = logging.Formatter(...)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
for l in loggers:
l.setLevel(logging.WARNING)
l.addHandler(handler)