2016-02-23 48 views
0

我想爲我的項目創建一個記錄器,該項目具有可在所有子模塊中工作並記錄未捕獲異常的自定義處理程序。以下是我的概念驗證;請注意,我正在使用文件處理程序作爲最終將成爲我的自定義處理程序的替身。如何向全局的Python Logger對象添加處理程序?

main.py:

import logging 
import sys 
from module import divide 

logger = logging.getLogger(__name__) 
logger.setLevel(logging.INFO) 

fh = logging.FileHandler("test.log") 
fh.setLevel(logging.INFO) 
logger.addHandler(fh) 

def uncaught_error(exc_type, exc_value, exc_traceback): 
    logger.error("Uncaught Exception", exc_info = (exc_type, exc_value, exc_traceback)) 
    sys.__excepthook__(exc_type, exc_value, exc_traceback) 
    return 

sys.excepthook = uncaught_error 

if __name__ == '__main__': 
    logger.info("first division problem") 
    print(divide(5,2)) 
    logger.info("second division problem") 
    print(divide(10,0)) 
    logger.info("end") 

module.py:

import logging 

logger = logging.getLogger(__name__) 

def divide(a, b): 
    logger.info("dividing " + str(a) + " by " + str(b)) 
    return a/b 

我跑main.py後,這裏是test.log中的輸出:

first division problem 
second division problem 
Uncaught Exception 
Traceback (most recent call last): 
    File "main.py", line 23, in <module> 
    print(divide(10,0)) 
    File "/some/path/logging_test/module.py", line 7, in divide 
    return a/b 
ZeroDivisionError: division by zero 

的在module.py中未捕獲的異常被記錄得很漂亮,但是行

logger.info("dividing " + str(a) + " by " + str(b)) 

顯然什麼都沒做(沒有任何控制檯輸出)。什麼是錯誤?

+0

它看起來像你只需要添加的處理程序中'main.py'記錄器;請嘗試使用'BasicConfig'來設置所有模塊的日誌記錄,請參閱https://docs.python.org/3/howto/logging.html中的示例。 – jonrsharpe

+0

@jonrsharpe據我所知,'BasicConfig'只能用於內置的處理程序;當然,在上面的概念證明中沒有問題,但是當我用自己的自定義處理程序替換FileHandler時沒有問題。除非我錯了? –

回答

0

我剛剛遇到了這個問題,其中我的根日誌格式沒有在其他子模塊中使用。我解決了這個改變

logger = logging.getLogger(__name__)

的main.py模塊

logger = logging.getLogger()

因此,它實際上得到root記錄器,而不是__main__記錄。

https://docs.python.org/2/library/logging.html#logging.getLogger

0

我有類似的問題,這是我做過什麼來解決這個問題: -

module.py

import logging 

def divide(a, b, logger): 

    logger.info("dividing " + str(a) + " by " + str(b)) 
    return a/b 

在main.py

呼叫鴻溝()通過將記錄爲第參數

print divide(5,2, logger) 

在您的情況處理程序未設置爲module.py

+1

問題在於該模塊。py實際上可能是十幾個模塊,每個模塊都有十幾個類和函數 - 肯定不需要重構整個項目就可以讓日誌工作?除此之外,@jonrsharpe在上面的評論中確實說明了一點:使用BasicConfig設置記錄器確實可以使記錄器在全局範圍內使用。如果該功能可以與定製處理程序正常工作,那麼我認爲我的狀態良好。 –

+0

它關於設計選擇,在我看來全局記錄器就像有全局變量,我們知道使用全局變量的副作用。如果我們有很多模塊,那麼我們可能不希望將所有日誌轉儲到單個日誌文件中 – AlokThakur

0

將您的自定義處理程序添加到根記錄器並完成。如果你沒有改變任何東西(沒有其他的默認值),只要你的其他記錄器的級別允許它們,所有你的模塊的記錄將被傳遞到該處理器。

所有(其他)記錄器都是根記錄器的後代。 This diagram應該有助於理解記錄中的信息流。