2015-06-14 61 views
7

我相信這是使用Python的內置日誌記錄模塊將主模塊中的logger作爲根記錄器的標準做法。假設這是正確的,在我看來,對於任何可能或不可能作爲主體運行的模塊,我都需要明確檢查。其原因是,如果我跟着叫logging.getLogger(__name__)的標準做法,我會得到一個名爲記錄__main__而不是根記錄:在Python中調用getLogger之前,是否需要顯式檢查__name__ ==「__main__」?

import logging 
print logging.getLogger().name # root 
print logging.getLogger(__name__).name # __main__ 

是最好的做法總是檢查?

if __name__ == "__main__": 
    logger = logging.getLogger() 
else: 
    logger = logging.getLogger(__name__) 

這不是那麼糟糕,因爲我會永遠有隻運行如果​​(通常包括logging.basicConfig通話)等代碼,但它會是不錯的只需要一條線,而不是更多。

+1

Python有一個三元組,你知道。所以,你可以這樣做:'記錄= logging.getLogger(!*([__ name__如果__name__ = '__main__' 別的[]))' –

回答

1

使用logging.getLogger(__name__)的做法是爲一個模塊級記錄器,如在 advanced logging tutorial說明。

在腳本(或應用程序的主模塊)一般我不創建記錄器在所有,但我改變根記錄器的配置;

opts = argparse.ArgumentParser(prog='foo', description=__doc__) 
group.add_argument('-v', '--version', action='version', 
        version=__version__) 
opts.add_argument('--log', default='warning', 
        choices=['debug', 'info', 'warning', 'error'], 
        help="logging level (defaults to 'warning')") 
opts.add_argument("files", metavar='file', nargs='*', 
        help="one or more files to process") 
args = opts.parse_args(argv) 
logging.basicConfig(level=getattr(logging, args.log.upper(), None), 
        format='%(levelname)s: %(message)s') 
+0

,所以我可能有一個叫做'__main__'一個模塊級記錄儀*和*一根記錄,並觸摸根記錄比如說,如果我要附加一個'Handler'擊中我的所有日​​志記錄? – kuzzooroo

2

是的 - 我相信這是一個好主意。因爲 - 會發生什麼情況如下 -

如果您正在運行的程序的蟒蛇prog.py - (在__name____main__),你會得到root記錄器(預期)。或者你甚至可以給你一個你想要的名字(比如prog)。而當你模塊import - 名稱將是模塊的名稱。 (Python文件名不帶擴展名在這種情況下prog),這將幫助您確定日誌的來源 - 這是你想要的東西。所以一般來說這樣做是個好主意。

相關問題