使用多个模块进行python日志记录不起作用

dan*_*iel 5 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")
Run Code Online (Sandbox Code Playgroud)

b.py

import logging
logger = logging.getLogger(__name__)

class B(object):
    def __init__(self):
        logger.debug("Instance of B")
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

我还尝试使用类似的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
Run Code Online (Sandbox Code Playgroud)

其次,我将logger = logging.getLogger(__name__)in 更改main_one.pylogger = logging.getLogger()root logger没有名称!)。

做到了。

GitHub上的代码段非常有用。

Jak*_* M. 2

print __name__对每个模块进行操作,看看实际会得到什么。您应该将模块放入正确的目录中,这样__name__就是“句点分隔的层次结构值”。例如,如果您的文件层次结构如下所示:

\n\n
main_a.py\nlibs/\n  __init__.py\n  a.py\n  modA.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么__name__你的模块(a.pymodA.py)将是libs.alibs.modA

\n\n
\n

该名称可能是一个以句点分隔的层次结构值,例如\n foo.bar.baz(例如,尽管它也可能只是简单的 foo)。\n 层次结构列表中更靠下的记录器是\n 记录器的子项在列表中排名靠前。例如,给定名称为 foo 的记录器,名称为 foo.bar、foo.bar.baz 和 foo.bam 的记录器都是 foo 的后代。记录器名称层次结构类似于 Python 包层次结构,如果您使用推荐的构造logging.getLogger( name ) 在每个模块的基础上组织记录器,则与之相同。That\xe2\x80\x99s 因为在模块中,名称是\n Python 包命名空间中的模块\xe2\x80\x99s 名称。

\n
\n