我创建了一些Python文件,使我的功能稍微分开,以简化工作/修复。所有文件都在一个目录中。结构可能会分解为:
每个模块都使用python中的日志记录。这就是为什么 - 只写入根记录器消息。我没有看到我的错误。
这是一个最小的例子。
a.py
import logging
logger = logging.getLogger(__name__)
class A(object):
def __init__(self):
logger.debug("Instance of A")
b.py
import logging
logger = logging.getLogger(__name__)
class B(object):
def __init__(self):
logger.debug("Instance of B")
ab.py
import a
import b
import logging
logger = logging.getLogger(__name__)
class AB(a.A, b.B):
def __init__(self):
logger.debug("Instance of AB")
a.A.__init__(self)
b.B.__init__(self)
main_one.py
import sys
import ab
import logging
import logging.handlers
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler(stream=sys.stderr)
handler.setLevel(logging.DEBUG)
handler.setFormatter(logging.Formatter('%(name)s: %(message)s'))
logger.addHandler(handler)
logger.warning("The trouble starts")
ab = ab.AB()
我还尝试使用self.logger = logging.getLogger(type(self).__name__)
之类的东西来记录每个类的基础,但结果是一样的。那么你们其中一个人在阅读python日志手册时可能会指出我哪里出错了吗?
TIA。
编辑1:我的解决方案
感谢@falsetru和@Jakub M.,使用这两个答案可以找到一个有效的解决方案。
首先,我将所有内容都放在层次结构中。
main_one.py
lib/
__init__.py
ab.py
basic/
__init__.py
a.py
b.py
第二我将logger = logging.getLogger(__name__)
中的main_one.py
更改为logger = logging.getLogger()
(根记录器没有名称!)。
这就是诀窍。
非常有用的是代码段on GitHub。
答案 0 :(得分:1)
为每个模块执行print __name__
并查看实际到达的内容。您应该将模块放入正确的目录中,以使__name__
为"period separated hierarchical value"。例如,如果您的文件层次结构如下所示:
main_a.py
libs/
__init__.py
a.py
modA.py
然后__name__
您的模块a.py
和modA.py
)将是libs.a
和libs.modA
该名称可能是一个以句点分隔的层次结构值,例如 foo.bar.baz(例如,它也可能只是普通的foo)。 分层列表中较低位的记录器是 记录器在列表中更高。例如,给定一个带有名称的记录器 of foo,名称为foo.bar,foo.bar.baz和foo.bam的记录器 所有foo的后代。记录器名称层次结构类似于 Python包层次结构,如果你组织你的相同 基于每个模块的记录器使用推荐的结构 logging.getLogger(的名称强>)。那是因为在模块中,名称是 Python包命名空间中的模块名称。
答案 1 :(得分:1)
对所有模块使用相同的记录器名称。 __name__
是模块名称; a
,b
,ab
,main_one
...
logger = logging.getLogger('daniel_lib')