2013-06-27 79 views
3

我创建了一些Python文件,使我的函数有点分离以便于工作/修复。所有文件都在一个目录中。该结构可能会分解成类似:使用多个模块的python日志记录不起作用

  • a.py(A类与基本的东西)
  • b.py(B类基本的东西)
  • modA.py(创建C类从A和B)
  • modB.py导出(创建一个类d从A导出和B)
  • ...
  • 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 

其次,我在main_one.py改变了logger = logging.getLogger(__name__)logger = logging.getLogger()没有名称为根记录!)。

这样做。

非常有帮助的是代码段on GitHub

回答

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,例如)。 层次列表中进一步向下的记录器是列表中较高位置的 记录器的子项。例如,给定名为foo的名称为 的记录器,名称为foo.bar,foo.bar.baz和foo.bam的记录器是foo的所有后代 。记录器名称层次类似于 Python包层次结构,如果使用推荐的构造 logging.getLogger(名称)以模块为单位组织您的 记录器,它与Python包层次结构类似。这是因为在模块中,名称是 该模块在Python包名称空间中的名称。

1

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

logger = logging.getLogger('daniel_lib') 
+0

好了 - 这解决了一个工作基地问题,但还是带来了一些问题。据我所见,我失去了可移植性? – daniel

+0

@丹尼尔我不明白你的意思是'丢失可移植性'。 – falsetru

+0

@daniel,https://github.com/search?l=Python&q=getLogger&type=Code – falsetru

相关问题