Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有多个模块的python日志记录不起作用_Python_Logging - Fatal编程技术网

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

带有多个模块的python日志记录不起作用,python,logging,Python,Logging,我创建了一些Python文件,使我的函数稍微分开,以便于工作/修复。所有文件都在一个目录中。该结构可能会分解为以下内容: a、 py(具有基本材料的a类) b、 py(具有基本材料的b类a) modA.py(创建从a和B派生的C类) modB.py(创建从a和B派生的类D) 主管道(使用C类) 主管道(使用D类) 每个模块都使用python中的日志记录内容。为什么会这样-只写入根记录器消息。我看不出我的错误 这里是一个最小的例子 a.py import logging logger = l

我创建了一些Python文件,使我的函数稍微分开,以便于工作/修复。所有文件都在一个目录中。该结构可能会分解为以下内容:

  • a、 py(具有基本材料的a类)
  • b、 py(具有基本材料的b类a)
  • modA.py(创建从a和B派生的C类)
  • modB.py(创建从a和B派生的类D)
  • 主管道(使用C类)
  • 主管道(使用D类)
每个模块都使用python中的日志记录内容。为什么会这样-只写入根记录器消息。我看不出我的错误

这里是一个最小的例子

a.py

import logging
logger = logging.getLogger(__name__)

class A(object):
    def __init__(self):
        logger.debug("Instance of A")
import logging
logger = logging.getLogger(__name__)

class B(object):
    def __init__(self):
        logger.debug("Instance of B")
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)
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()
b.py

import logging
logger = logging.getLogger(__name__)

class A(object):
    def __init__(self):
        logger.debug("Instance of A")
import logging
logger = logging.getLogger(__name__)

class B(object):
    def __init__(self):
        logger.debug("Instance of B")
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)
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()
ab.py

import logging
logger = logging.getLogger(__name__)

class A(object):
    def __init__(self):
        logger.debug("Instance of A")
import logging
logger = logging.getLogger(__name__)

class B(object):
    def __init__(self):
        logger.debug("Instance of B")
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)
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()
main_one.py

import logging
logger = logging.getLogger(__name__)

class A(object):
    def __init__(self):
        logger.debug("Instance of A")
import logging
logger = logging.getLogger(__name__)

class B(object):
    def __init__(self):
        logger.debug("Instance of B")
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)
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).\uuu name\uuuuuuu)
的方法在每个类的基础上进行日志记录,但结果是一样的。所以,你们中的一位可以指出我在阅读python日志手册时出错的地方吗

蒂亚

编辑1:我的解决方案

多亏了@falsetru和@Jakub M,使用这两个答案可以得到一个有效的解决方案

首先,我把一切都放在一个层次结构中

main_one.py
  lib/
    __init__.py
    ab.py
    basic/
      __init__.py
      a.py
      b.py
第二,我将
main\u one.py
中的
logger=logging.getLogger(\uu name\uuu)
更改为
logger=logging.getLogger()
(根记录器没有名称!)

这就成功了


代码片段非常有用。

为每个模块打印
print\uuuuu name\uuuuu
,看看实际得到了什么。您应该将模块放在适当的目录中,以便
\uuuu name\uuuu
是一个好的选择。例如,如果文件层次结构如下所示:

main_a.py
libs/
  __init__.py
  a.py
  modA.py
然后,您的模块(
a.py
modA.py
)的
\uu名称
将是
libs.a
libs.modA

该名称可能是一个以句点分隔的层次结构值,如 foo.bar.baz(尽管它也可能只是普通的foo,例如)。 在层次结构列表中较低的记录器是 伐木工人在名单中排名靠前。例如,给定一个具有名称的记录器 对于foo,名称为foo.bar、foo.bar.baz和foo.bam的记录器是 所有富的后代。记录器名称层次结构类似于 Python包层次结构,如果您组织 使用推荐结构的每个模块的记录器 logging.getLogger(名称)。这是因为在模块中,name是 Python包命名空间中的模块名称


对所有模块使用相同的记录器名称<代码>\uuuu名称\uuuuu为模块名称<代码>a,
b
ab
main\u one

logger = logging.getLogger('daniel_lib')

好的-这在工作的基础上解决了问题,但仍然带来了一些问题。据我所知,我正在失去可移植性?@daniel我不明白你所说的
失去可移植性是什么意思。好吧,我可以在所有模块中使用固定的记录器名称,但如果我使用这些模块,我必须始终使用此记录器名称?似乎可以使用dir结构和config来实现这一点。