带有多个模块的python日志记录不起作用
我创建了一些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
- a、 py(具有基本材料的a类)
- b、 py(具有基本材料的b类a)
- modA.py(创建从a和B派生的C类)
- modB.py(创建从a和B派生的类D)
- 主管道(使用C类)
- 主管道(使用D类)
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来实现这一点。