带有多个模块的python日志记录不起作用

时间:2013-06-27 07:04:32

标签: python logging

我创建了一些Python文件,使我的功能稍微分开,以简化工作/修复。所有文件都在一个目录中。结构可能会分解为:

  • a.py(带有基本内容的A类)
  • b.py(B类基本内容)
  • modA.py(创建一个源自A和B的C类)
  • modB.py(创建一个源自A和B的D类)
  • ...
  • main_a.py(使用C类)
  • main_b.py(使用D类)

每个模块都使用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

2 个答案:

答案 0 :(得分:1)

为每个模块执行print __name__并查看实际到达的内容。您应该将模块放入正确的目录中,以使__name__"period separated hierarchical value"。例如,如果您的文件层次结构如下所示:

main_a.py
libs/
  __init__.py
  a.py
  modA.py

然后__name__您的模块a.pymodA.py)将是libs.alibs.modA

  

该名称可能是一个以句点分隔的层次结构值,例如   foo.bar.baz(例如,它也可能只是普通的foo)。   分层列表中较低位的记录器是   记录器在列表中更高。例如,给定一个带有名称的记录器   of foo,名称为foo.bar,foo.bar.baz和foo.bam的记录器   所有foo的后代。记录器名称层次结构类似于   Python包层次结构,如果你组织你的相同   基于每个模块的记录器使用推荐的结构   logging.getLogger(的名称)。那是因为在模块中,名称是   Python包命名空间中的模块名称。

答案 1 :(得分:1)

对所有模块使用相同的记录器名称。 __name__是模块名称; ababmain_one ...

logger = logging.getLogger('daniel_lib')