关于python:两个Pylons记录器处理程序(Sentry / Raven和控制台)具有相同的qualname

Two Pylons logger handlers (Sentry/Raven and console) for the same qualname

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

Sentry/Raven记录器应只接收Warn+级别的sqlAlchemy消息,控制台记录器应接收Info+级别的sqlAlchemy消息。

这是我的缩写ini文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[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文件中的记录器顺序如何,都会发生这种情况。

是否可以使用塔架将同一个记录器/qualname记录到不同级别的多个位置?

如果是这样,哨兵/乌鸦有可能成为这些伐木者之一吗?我的ini文件有什么问题吗,或者Raven中有错误吗?


您遇到的问题是,您配置了两次sqlalchemy.engineLogger。logger部分对应于logging.Logger的实例,logging.getLogger(qualname)返回的内容。该调用只能返回一个对象,不能设置多个同名对象。

您需要的是该记录器的多个处理程序,这与为根记录器提供多个处理程序的方式相同。然后可以在各个处理程序上指定所需的日志级别。

不幸的是,fileConfig()并没有给您一种简单的方法来配置同一个具有不同日志级别的处理程序,这取决于生成记录的记录器,您需要为根和sqlalchemy.engine记录器设置重复的处理程序部分,以便具有不同的日志级别。


你把记录器和处理程序搞混了——正如TokenMacGuy所说,你需要两个处理程序来处理名为sqlalchemy.engine的记录器。配置StreamHandler级(控制台)和WARNING级(岗哨)、SentryHandler级(岗哨)、DEBUGINFO级的sqlalchemy.engine记录器。然后你应该得到想要的结果。(即使记录了DEBUG条消息,处理程序上的级别也会阻止它们发出低于其级别的事件。)

除非您仅限于python 2.6或更早版本,否则如果可以的话,最好考虑使用logging.config.dictConfigAPI而不是logging.config.fileConfigdictConfigAPI比旧的fileConfigAPI更好地控制日志配置,而旧的fileConfigAPI将不会进一步开发。