1

我有一个 Pylons/TurboGears 应用程序。我想记录相同的记录器(由qualname属性指定)以使用两个不同的日志处理程序,每个处理程序都有自己的日志级别。

Sentry / Raven 记录器应该只接收 WARN+ 级别的 SQLAlchemy 消息,而控制台记录器应该接收 INFO+ 级别的 SQLAlchemy 消息。

这是我的缩写 ini 文件:

[loggers]
keys = root, sqlalchemy_console, sqlalchemy_sentry

[handlers]
keys = console, sentry

[formatters]
keys = generic

[logger_root]
level = INFO
handlers = console, sentry

[logger_sqlalchemy_console]
level = INFO
handlers = console
qualname = sqlalchemy.engine
propagate = 0

[logger_sqlalchemy_sentry]
level = WARN
handlers = sentry
qualname = sqlalchemy.engine
propagate = 0

然而,logger_sqlalchemy_sentry似乎覆盖logger_sqlalchemy_console并窃取了它的信息。无论 ini 文件中记录器的顺序如何,都会发生这种情况。

是否可以使用 Pylons 将相同的 logger/qualname 记录到具有不同级别的多个位置?

如果是这样,Sentry/Raven 是否有可能成为这些记录器之一?我的 ini 文件有问题,还是 Raven 有错误?

4

2 回答 2

2

您遇到的问题是您要配置sqlalchemy.engine Logger两次。记录器部分对应于logging.Logger, 返回的事物的实例logging.getLogger(qualname)。该调用只能返回一个对象,您不可能使用相同的 qualname 设置多个对象。

您需要的是该记录器的多个处理程序,就像您为根记录器提供多个处理程序一样。然后,您可以在各个处理程序上指定所需的日志级别。

不幸的是,fileConfig()并没有为您提供一种简单的方法来配置具有不同日志级别的相同处理程序,具体取决于发起记录的记录器,您需要为 root 和sqlalchemy.engine记录器设置重复的处理程序部分以便拥有不同的日志他们的水平。

于 2013-08-23T15:21:18.823 回答
1

您将记录器和处理程序混为一谈-如前所述TokenMacGuy,您需要两个用于名为. 将(console)配置为level ,将(sentry) 配置为 level ,并将logger 的 level 配置为or 。然后你应该得到想要的结果。(即使记录了消息,处理程序的级别也会阻止它们发出低于其级别的事件。)sqlalchemy.engineStreamHandlerINFOSentryHandlerWARNINGsqlalchemy.engineDEBUGINFODEBUG

除非您仅限于 Python 2.6 或更早版本,否则如果可以的话,值得考虑logging.config.dictConfig优先使用 API logging.config.fileConfig。与旧的 API 相比,该dictConfigAPI 可以更好地控制日志记录配置,旧fileConfigAPI 不会进一步开发。

于 2013-08-24T10:49:15.043 回答