2013-06-05 46 views
7

我試圖添加日誌記錄(到控制檯而不是文件)我的一段代碼,我一直在努力。閱讀了一下後,我有一種我認爲應該起作用的模式,但是我不太確定我要出錯的位置。跨多個模塊的Python日誌記錄

我有以下三個文件(簡化,顯然):

controller.py

import my_module  
import logging 
from setup_log import configure_log 

def main(): 
    logger = configure_log(logging.DEBUG, __name__) 
    logger.info('Started logging') 
    my_module.main() 

if __name__ == "__main__": 
    main() 

setup_log.py

import logging 

def configure_log(level=None, name=None): 
    logger = logging.getLogger(name) 
    logger.setLevel(level) 
    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.DEBUG) 
    chFormatter = logging.Formatter('%(levelname)s - %(filename)s - Line: %(lineno)d - %(message)s') 
    console_handler.setFormatter(chFormatter) 
    logger.addHandler(console_handler) 
    return logger 

my_module.py

import logging 

def main():  
    logger = logging.getLogger(__name__) 
    logger.info("Starting my_module") 
    print "Something" 

if __name__ == "__main__": 
    main() 

當我跑步時em,只有第一次調用logging纔會產生一個輸出到控制檯 - 'Started logging'。第二次調用日誌記錄 - 「啓動我的模塊」剛剛通過。

我誤會了什麼?

+1

如果你想以完全相同的方式配置它們,你爲什麼要首先配置兩個單獨的記錄器('__main__'和'my_module')?爲什麼不只是使用'getLogger()'配置一次,並在任何地方使用? – abarnert

回答

15

根據它看起來documentation像你也許可以僥倖逃脫,像這樣一個更簡單的設置:

如果你的程序是由多個模塊組成,這裏有一個如何 你可以在它舉辦的日誌記錄的例子:

# myapp.py 
import logging 
import mylib 

def main(): 
    logging.basicConfig(filename='myapp.log', level=logging.INFO) 
    logging.info('Started') 
    mylib.do_something() 
    logging.info('Finished') 

if __name__ == '__main__': 
    main() 

# mylib.py 
import logging 

def do_something(): 
    logging.info('Doing something') 

如果運行myapp.py,你應該在myapp.log看到這一點:

INFO:root:Started 
INFO:root:Doing something 
INFO:root:Finished 

它看起來像您的來電logger = logging.getLogger(__name__)你的模塊內部創建一個單獨的軌道(與水平的NOTSET但沒有父母的關係,導致日誌條目)

+1

謝謝,我無法繞過文檔。並輸出到控制檯,它看起來像我只是不指定文件名參數,如:'logging.basicConfig(level = logging.INFO)' –

+0

一旦你設置如上記錄,你可能也想登錄到安慰。這是一個非常簡單的方法來爲所有記錄器添加額外的處理程序,將控制檯處理程序添加到根記錄器,並因此添加到所有記錄器實例。 logging.getLogger('')。addHandler(logging.StreamHandler(sys.stdout)) – CodeKid

2

實際的錯誤可略見一斑把線:

print '__name__', __name__ 

兩個main初我這將產生:

$ python controller.py 
__name__ __main__ 
INFO - controller.py - Line: 8 - Started logging 
__name__ my_module 
Something 

因此,您正確配置了名爲__main__的記錄器,但未配置名爲my_module的記錄器。

更深層的問題是,你有兩個main方法可能會讓你感到困惑(它是我)。

相關問題