2010-11-10 83 views
20

某處在我的代碼的腸子我有類似:日誌層次與根日誌?

logger = logging.getLogger('debug0.x') 

就我的理解,這應該當我以前做過類似只有迴應:

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG, name='debug0') 

注意名稱已定義爲debug0。然而,我發現,如果做

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG) 

沒有關鍵字,那麼debug0.x記錄器上面定義的反應,並寫入日誌文件。我認爲這隻會在第一種情況下作出反應,當記錄器被命名時。

我很困惑。

+3

['logging.basicConfig()'](http://docs.python.org/library/logging.html#logging.basicConfig)沒有'name'關鍵字參數。 – 2010-11-10 23:46:37

回答

52

Python的logging模塊組織在記錄一個層次。所有記錄器都是根記錄器的後代。每個記錄器都將日誌消息傳遞給其父代。

使用getLogger()函數創建新的記錄器。函數調用logging.getLogger('debug0.x')創建了一個記錄器x,它是debug0的孩子,它本身是根記錄器的子代。當記錄到這個記錄器時,它會將消息傳遞給它的父代,並且它的父代會將消息傳遞給根記錄器。您將根記錄器配置爲通過basicConfig()函數登錄到文件,因此您的消息將在此處結束。

+0

那麼在Python中獲取記錄器的最佳做法是什麼?在Java中,您只需執行一個getLogger(getClass()。getName())(或一些便利方法getLogger(getClass())',它代表我提到的另一種方法)。我們應該在Python中使用什麼?當然,我們不必編寫一些記錄器ID並手動插入我們創建的每個模塊。 – 2016-10-08 00:49:37

+2

@Garret Python中最常用的方法是在每個模塊的頂部使用'logger = logging.getLogger(__ name __)'。變量'__name__'包含當前模塊的虛線名稱。 – 2016-10-08 08:27:07

+1

爲什麼最佳實踐不使用'_logger',以便導入模塊時不暴露變量? – 2016-10-17 23:32:25

10

如果檢查出的代碼或文檔:

>>> print logging.basicConfig.__doc__ 

    Do basic configuration for the logging system. 

    This function does nothing if the root logger already has handlers 
    configured. ............... 
    A number of optional keyword arguments may be specified, which can alter 
    the default behaviour. 

    filename Specifies that a FileHandler be created, using the specified 
       filename, rather than a StreamHandler. 
    filemode Specifies the mode to open the file, if filename is specified 
       (if filemode is unspecified, it defaults to 'a'). 
    format Use the specified format string for the handler. 
    datefmt Use the specified date/time format. 
    level  Set the root logger level to the specified level. 
    stream Use the specified stream to initialize the StreamHandler. Note 
       that this argument is incompatible with 'filename' - if both 
       are present, 'stream' is ignored. 

logging.basicConfig不使用名稱參數在所有。它初始化根記錄器。雖然getLogger需要一個「名」的說法

>>> print logging.getLogger.__doc__ 

    Return a logger with the specified name, creating it if necessary. 

    If no name is specified, return the root logger.