我有一个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将相同的记录器/质量名称记录到具有不同级别的多个位置?
如果是这样,哨兵/乌鸦有可能成为这些伐木者之一吗? 我的 ini 文件有问题,还是 Raven 中有错误?
遇到的问题是您将sqlalchemy.engine
Logger
配置了两次。 记录器部分对应于logging.Logger
的实例,由logging.getLogger(qualname)
返回的东西。 该调用只能返回一个对象,您不可能使用相同的 qualname 设置多个对象。
,就像您为根记录器提供多个处理程序一样。 然后,您可以在各个处理程序上指定所需的日志级别。
遗憾的是,fileConfig()
没有为您提供一种简单的方法来根据产生记录的记录器配置具有不同日志级别的同一处理程序,但您需要为 root 和 sqlalchemy.engine
记录器设置重复处理程序部分,以便为它们设置不同的日志级别。
你把记录器和处理程序弄混了 - 正如TokenMacGuy
所说,你需要两个名为 sqlalchemy.engine
的记录器的处理程序。配置级别为 INFO
的StreamHandler
(控制台(和级别为 WARNING
的SentryHandler
(哨兵(以及级别为 DEBUG
或 INFO
的sqlalchemy.engine
记录器。然后你应该得到想要的结果。(即使记录了DEBUG
消息,处理程序上的级别也会阻止它们发出小于其级别的事件。
除非仅限于 Python 2.6 或更早版本,否则如果可以的话,值得考虑优先使用 logging.config.dictConfig
API 而不是 logging.config.fileConfig
API。与旧的 fileConfig
API 相比,dictConfig
API 允许更好地控制日志记录配置,后者不会进一步开发。