2016-07-15 75 views
1

我在使用python的日誌記錄時遇到了一些困難。我有兩個文件,main.py和mymodule.py。通常運行main.py,它會導入mymodule.py並使用一些函數。但有時候,我會直接運行mymodule.py。python日誌記錄 - 消息沒有顯示在子裏

我試圖讓日誌只配置在1個位置,但有些東西似乎是錯誤的。

這是代碼。

# main.py 
import logging 
import mymodule 

logger = logging.getLogger(__name__) 

def setup_logging(): 
    # only cofnigure logger if script is main module 
    # configuring logger in multiple places is bad 
    # only top-level module should configure logger 
    if not len(logger.handlers): 
     logger.setLevel(logging.DEBUG) 
     # create console handler with a higher log level 
     ch = logging.StreamHandler() 
     ch.setLevel(logging.DEBUG) 
     formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S') 
     ch.setFormatter(formatter) 
     logger.addHandler(ch) 

if __name__ == '__main__': 
    setup_logging() 
    logger.info('calling mymodule.myfunc()') 
    mymodule.myfunc() 

和導入的模塊:

# mymodule.py 
import logging 

logger = logging.getLogger(__name__) 

def myfunc(): 
    msg = 'myfunc is being called' 
    logger.info(msg) 
    print('done with myfunc') 


if __name__ == '__main__': 
    # only cofnigure logger if script is main module 
    # configuring logger in multiple places is bad 
    # only top-level module should configure logger 
    if not len(logger.handlers): 
     logger.setLevel(logging.DEBUG) 
     # create console handler with a higher log level 
     ch = logging.StreamHandler() 
     ch.setLevel(logging.DEBUG) 
     formatter = logging.Formatter('%(levelname)s: %(asctime)s %(funcName)s(%(lineno)d) -- %(message)s', datefmt = '%Y-%m-%d %H:%M:%S') 
     ch.setFormatter(formatter) 
     logger.addHandler(ch) 
    logger.info('myfunc was executed directly') 
    myfunc() 

當我運行的代碼,我看到這樣的輸出:

$>python main.py 
INFO: 2016-07-14 18:13:04 <module>(22) -- calling mymodule.myfunc() 
done with myfunc 

但我希望看到這一點:

$>python main.py 
INFO: 2016-07-14 18:13:04 <module>(22) -- calling mymodule.myfunc() 
INFO: 2016-07-14 18:15:09 myfunc(8) -- myfunc is being called 
done with myfunc 

有人有任何想法爲什麼第二個logging.info調用不打印到屏幕?提前致謝!

回答

0

記錄器存在於層次結構中,其頂部有一個根記錄器(在logging.getLogger()中檢索到,沒有參數)。每個記錄器都會從父級繼承配置,而記錄器本身的任何配置都會覆蓋繼承的配置。在這種情況下,您從不配置根記錄器,只能配置main.py中的模塊特定記錄器。因此,從不配置mymodule.py中的模塊特定記錄器。

最簡單的解決方法是使用logging.basicConfigmain.py中設置要共享的選項全部記錄器。

+0

謝謝,但它似乎仍然沒有工作。在創建記錄器obj之前,我將日誌記錄級別設置爲INFO。像這樣 logging.basicConfig(level = logging.INFO) logger = logging.getLogger(__ name__) 然後在setup_logging中,我添加了ch處理程序,並具有一定的調試級別。然後在mymodule裏面,我添加了一個logger.debug語句。當我調用main.py時,mymodule中的調試消息不顯示。 – box

0

Chepner是正確的。我陷入了這個問題。問題是,您只需在主腳本

16 log = logging.getLogger() # use this form to initialize the root logger 
17 #log = logging.getLogger(__name__) # never use this one 

如果你用17行,然後導入的Python模塊將不記錄任何消息

在你submodule.py

import logging 
logger = logging.getLogger() 
logger.debug("You will not see this message if you use line 17 in main") 

希望此公告可以幫助陷入這個問題的人。

+0

我不確定這個問題是python 3.5的具體與否,因爲我在3.5編碼時遇到這個問題。 –

+0

這對我不起作用。如果我在記錄器名稱log = logging.getLogger(「main_log」)中硬編碼,我可以使它工作,但僅限於主模塊。使用相同方法的子模塊不會在日誌中顯示其消息。但是,如果我使用'log = logging.getLogger()',我不會從主模塊或其子模塊收到任何消息。 – user5359531