我已经看过Using Python logging in multiple modules和类似的推荐使用:-
import logging
logger = logging.getLogger(__name__)在每个模块里。不过,我也使用Kivy作为前端,它有自己的日志代码。总之,Kivy的日志代码将logging.root设置为自己的类。
这对我来说意味着,Kivy分配的处理程序不是由我的子模块继承的。
我怎么才能避开这一切?我甚至尝试过手动分配处理程序如下:
logging.getLogger(my.module.name).addHandler(handler)它似乎还没有出现在我的控制台日志中。显然,我也不希望在每个模块中执行上述操作一次。
编辑
为了澄清,我想设置Kivy应用程序,以便能够处理使用“推荐”日志方法的模块,而不会对模块代码进行任何更改。
发布于 2016-03-20 03:14:33
为什么不使用logging.Logger.getChild呢?特别是,在您的模块中,调用
mylogger = logging.getLogger().getChild(__name__)如果模块是在kivy.logger导入后导入的,则根记录器的名称将是kivy,因此mylogger的名称将是kivy.module.name,更重要的是,它将将其消息传播到根记录器kivy。另一方面,如果没有导入kivy.logger,则mylogger的名称将只是module.name,因此默认情况下没有附加处理程序。
示例:test.py
import logging
class MyClass(object):
def __init__(self):
super(MyClass, self).__init__()
self.logger = logging.getLogger().getChild(__name__)
self.value = 0
def act(self):
self.value += .5
self.logger.warning("MyClass.act: value: {}".format(self.value))
if __name__ == '__main__':
mc = MyClass()
mc.act()
mc.act()
mc.act()和app.py
from kivy.app import App
from kivy.logger import Logger
from kivy.clock import Clock
from kivy.properties import ObjectProperty, NumericProperty
from kivy.uix.widget import Widget
from test import MyClass
class AnApp(App):
mc = ObjectProperty()
value = NumericProperty(0)
def action_c(self, dt=0):
self.value += 1
self.mc.act()
Logger.info("action_c: value now {}".format(self.value))
def build(self):
self.mc = MyClass()
Clock.schedule_interval(self.action_c, 1)
return Widget()
AnApp().run()和app_wo_kivy.py
import logging
from test import MyClass
logging.getLogger().addHandler(logging.StreamHandler())
mc = MyClass()
mc.act()
mc.act()编辑
另一种方法是:在kivy应用程序中,将以下内容放在第一位:
from kivy.logger import Logger
import logging
logging.Logger.manager.root = Logger # before importing modules using logging这样,您就可以使用获取记录器(logger = logging.getLogger(__name__))的标准方法。这将适用于现有模块(假设它们不影响logging本身.)。logging.Logger.manager保存记录器字典并确定层次结构。每当使用logging.getLogger创建新的记录器时,都会调用logging.Manager._fixupParents,如果找不到其他父记录器,则将logging.Logger.manager.root指定为父记录器。如果没有上面的行,这仍然是原始的根记录器,因此将使用它。
现在我不知道这是否会产生意想不到的后果;但是至少不应该破坏记录器名称解析,因为根记录器的名称从未被检查过。
https://stackoverflow.com/questions/36106353
复制相似问题