7

我创建了一些 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__)in更改main_one.pylogger = logging.getLogger()没有根记录器的名称!)。

那成功了。

非常有用的是GitHub 上的代码片段。

4

2 回答 2

2

为你print __name__的每个模块做,看看你实际得到了什么。您应该将模块放入适当的目录__name__中, “句点分隔的层次值”也是如此。例如,如果您的文件层次结构如下所示:

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

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

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

于 2013-06-27T07:14:09.067 回答
1

对所有模块使用相同的记录器名称。__name__是模块名称;a, b, ab, main_one...

logger = logging.getLogger('daniel_lib')
于 2013-06-27T07:14:28.367 回答