2013-06-27 76 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

相關問題