嘗試使用logging.getLogger()來獲取你的日誌對象實例:
http://docs.python.org/3/library/logging.html#logging.getLogger
所有調用該函數在給定的名稱返回相同的記錄器實例。這意味着記錄器實例永遠不需要在應用程序的不同部分之間傳遞。
UPDATE:
推薦的方法做,這是使用getLogger()函數,並對其進行配置(設置的處理程序,格式化等):
# main.py
import logging
import lib
def main():
logger = logging.getLogger('custom_logger')
logger.setLevel(logging.INFO)
logger.addHandler(logging.FileHandler('test.log'))
logger.info('logged from main module')
lib.log()
if __name__ == '__main__':
main()
# lib.py
import logging
def log():
logger = logging.getLogger('custom_logger')
logger.info('logged from lib module')
如果你確實是需要延長記錄器類看看logging.setLoggerClass(klass)
更新2:http://docs.python.org/2/howto/logging.html#custom-levels
定義自定義:在添加自定義級別不建議
# main.py
import logging
import lib
# Extend Logger class
CUSTOM_LEVEL_NUM = 9
logging.addLevelName(CUSTOM_LEVEL_NUM, 'CUSTOM')
def custom(self, msg, *args, **kwargs):
self._log(CUSTOM_LEVEL_NUM, msg, args, **kwargs)
logging.Logger.custom = custom
# Do global logger instance setup
logger = logging.getLogger('custom_logger')
logger.setLevel(logging.INFO)
logger.addHandler(logging.FileHandler('test.log'))
def main():
logger = logging.getLogger('custom_logger')
logger.custom('logged from main module')
lib.log()
if __name__ == '__main__':
main()
注:關於如何添加自定義日誌記錄級別不改變日誌類
例處理程序和可能使用多個記錄器可能會爲您的其他要求做到訣竅:可選輸出到stderr。
對不起,在這裏稍微密集....所以然後如果我有一個主要模塊實例化我自己的日誌類(其中包含日誌記錄類),那麼通過簡單地調用我的日誌對象很容易記錄的東西。但是,如果我的主要導入其他模塊,如何調用我的Log類方法進行日誌記錄而不將日誌句柄傳遞給每個方法?你能提供一個使用多個模塊的例子嗎? – GregH
我提供了一個使用多個模塊和getLogger()函數的示例。如果您真的認爲使用getLogger創建記錄器並配置自定義處理程序,格式化程序並不足以滿足您的需求,請詳細說明自定義Logger類的基本原理,但很少有必須擴展Logger(logging.getLoggerClass())類。 – gonz
@GregH我的例子有道理嗎?讓我知道如果這解決了你的問題,或者你需要進一步的解釋。 – gonz