首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在重新定义logging.root时使用python 'logging‘(Kivy)

在重新定义logging.root时使用python 'logging‘(Kivy)
EN

Stack Overflow用户
提问于 2016-03-19 19:47:11
回答 1查看 1.6K关注 0票数 5

我已经看过Using Python logging in multiple modules和类似的推荐使用:-

代码语言:javascript
复制
import logging
logger = logging.getLogger(__name__)

在每个模块里。不过,我也使用Kivy作为前端,它有自己的日志代码。总之,Kivy的日志代码将logging.root设置为自己的类。

这对我来说意味着,Kivy分配的处理程序不是由我的子模块继承的。

我怎么才能避开这一切?我甚至尝试过手动分配处理程序如下:

代码语言:javascript
复制
logging.getLogger(my.module.name).addHandler(handler)

它似乎还没有出现在我的控制台日志中。显然,我也不希望在每个模块中执行上述操作一次。

编辑

为了澄清,我想设置Kivy应用程序,以便能够处理使用“推荐”日志方法的模块,而不会对模块代码进行任何更改。

EN

回答 1

Stack Overflow用户

发布于 2016-03-20 03:14:33

为什么不使用logging.Logger.getChild呢?特别是,在您的模块中,调用

代码语言:javascript
复制
mylogger = logging.getLogger().getChild(__name__)

如果模块是在kivy.logger导入后导入的,则根记录器的名称将是kivy,因此mylogger的名称将是kivy.module.name,更重要的是,它将将其消息传播到根记录器kivy。另一方面,如果没有导入kivy.logger,则mylogger的名称将只是module.name,因此默认情况下没有附加处理程序。

示例:test.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
import logging
from test import MyClass
logging.getLogger().addHandler(logging.StreamHandler())

mc = MyClass()
mc.act()
mc.act()

编辑

另一种方法是:在kivy应用程序中,将以下内容放在第一位:

代码语言:javascript
复制
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指定为父记录器。如果没有上面的行,这仍然是原始的根记录器,因此将使用它。

现在我不知道这是否会产生意想不到的后果;但是至少不应该破坏记录器名称解析,因为根记录器的名称从未被检查过。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36106353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档