Python日志记录 - 全局应用格式化程序

时间:2011-06-27 18:57:25

标签: python logging

我使用短语!Silent来确定日志记录的保存位置 如果日志记录消息在字符串的开头包含!Silent,则Filter子类会在StreamHandler中拒绝此消息。但邮件会传递给其他处理程序,例如FileHandlerMemoryHandler,并会以!Silent短语传递。

我创建了简单的Formatter子类来删除这个短语,包括字符串开头的白色字符,但是我将这个格式化程序应用于处理程序时遇到了麻烦。

在我的应用程序的许多地方,我修改根记录器处理程序,创建,添加和删除它。这些处理程序中的每一个都应该有我的Formatter子类,但是手动添加到每个处理程序都有点不舒服。

我想方法将Formatter类全局应用于root logger,或者覆盖root logger addHandler方法,在将其添加到root logger之前将过滤器添加到handler。或者更简单的方法(如果存在)。

1 个答案:

答案 0 :(得分:1)

老实说,我不确定我是否完全理解你的问题,所以请原谅我,如果我的答案不是你想要的......但是,在每个处理程序的输入上应用过滤器,我会添加一个属性你传递的unicode(或字符串)对象。类似的东西:

>>> class LogMsg(unicode):
...      def __new__(cls, string_):
...         if string_[:7] == '!Silent':
...             cls.nolog = True
...             return super(LogMsg, cls).__new__(cls, string_[7:])
...         else:
...             cls.nolog = False
...             return super(LogMsg, cls).__new__(cls, string_)
... 
>>> a = LogMsg('The hard drive is on fire!')
>>> a
u'The hard drive is on fire!'
>>> a.nolog
False
>>> b = LogMsg('!SilentMy feet stink! :(')
>>> b
u'My feet stink! :('
>>> b.nolog
True

通过这种方式,您可以简单地传递“字符串”,该字符串从不显示!Silent,但有一个隐藏的标记(nolog),只有在您需要时才能测试。

HTH, / MAC