我使用短语!Silent
来确定日志记录的保存位置
如果日志记录消息在字符串的开头包含!Silent
,则Filter
子类会在StreamHandler
中拒绝此消息。但邮件会传递给其他处理程序,例如FileHandler
或MemoryHandler
,并会以!Silent
短语传递。
我创建了简单的Formatter
子类来删除这个短语,包括字符串开头的白色字符,但是我将这个格式化程序应用于处理程序时遇到了麻烦。
在我的应用程序的许多地方,我修改根记录器处理程序,创建,添加和删除它。这些处理程序中的每一个都应该有我的Formatter
子类,但是手动添加到每个处理程序都有点不舒服。
我想方法将Formatter类全局应用于root logger,或者覆盖root logger addHandler
方法,在将其添加到root logger之前将过滤器添加到handler。或者更简单的方法(如果存在)。
答案 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