2011-11-25 93 views
10

我在一個簡單的腳本中使用Python日誌記錄模塊,並使用以下設置。Python只記錄腳本中的日誌

logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S') 
logger = logging.getLogger(__name__) 

我的問題是,這也捕獲第三方模塊,如請求和輸出信息()他們的日誌消息。有什麼辦法來抑制這些消息或告訴日誌記錄模塊只記錄來自我自己的腳本的消息?

回答

10

使用命名記錄器在你的模塊:

import logging 
logger = logging.getLogger(__name__) 
logger.info("my info") 
logger.error("my error") 

您可以設置日誌級別的所有其他記錄器錯誤,併爲您記錄儀調試:

import logging 
logging.basicConfig(level=logging.ERROR) 
logging.getLogger(my_module.__name__).setLevel(logging.DEBUG) 
0

以上的答案是不真的是正確的 - 它只會將來自其他模塊的消息的欄設置得更高。

一個非常快速的方法是使用這段代碼:

import logging.config 
logging.config.dictConfig({ 
    'version': 1, 
    'disable_existing_loggers': True, 
}) 

你必須導入所有模塊後,設置此 - 這將禁用創建到這一點的所有記錄。這在大多數情況下都能正常工作,但有些模塊會在您創建類實例時創建它們的記錄器(這將在您的代碼中稍後發生)。


當你根據基本的Python教程,他們告訴你使用logging.basicConfig(...)設置記錄器。這是一個問題,因爲這會將處理程序(也就是日誌將被路由到的位置)設置爲logging.lastResort,這是全球範圍內的Python 3.2開始的所有記錄器的標準錯誤。這意味着您現在已經爲所有模塊啓用了完整日誌記錄。

所以更好的方法是創建一個不同的記錄器只爲您的模塊,並給它自己的一些處理程序,而不是使用basicConfig()

有這樣做的方法有兩種:

1)所有功能:

import logging 

log = logging.getLogger(__name__) 
log.setLevel(logging.DEBUG) 
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s", 
          datefmt="%Y-%m-%d - %H:%M:%S") 
ch = logging.StreamHandler(sys.stdout) 
ch.setLevel(logging.DEBUG) 
ch.setFormatter(formatter) 
fh = logging.FileHandler("mylog.log", "w") 
fh.setLevel(logging.DEBUG) 
fh.setFormatter(formatter) 
log.addHandler(ch) 
log.addHandler(fh) 

這會給你的記錄log,然後您可以使用像log.error("Error found")。它將寫入一個名爲mylog.log的新文件,並且還會記錄如此的sys.stdout。你可以根據自己的喜好來改變它。

2)使用的字典:

import logging 
import logging.config 

DEFAULT_LOGGING = { 
    'version': 1, 
    'formatters': { 
     'standard': { 
      'format': '%(asctime)s %(levelname)s: %(message)s', 
      'datefmt': '%Y-%m-%d - %H:%M:%S' }, 
    }, 
    'handlers': { 
     'console': {'class': 'logging.StreamHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'stream': sys.stdout}, 
     'file':  {'class': 'logging.FileHandler', 
        'formatter': "standard", 
        'level': 'DEBUG', 
        'filename': 'live_detector.log','mode': 'w'} 
    }, 
    'loggers': { 
     __name__: {'level': 'INFO', 
        'handlers': ['console', 'file'], 
        'propagate': False }, 
    } 
} 

logging.config.dictConfig(DEFAULT_LOGGING) 
log = logging.getLogger(__name__) 

這將給予相同的結果上面,時間長一點,但也許更容易閱讀。這會自動設定'disable_existing_loggers': True。如果你不想這樣做,你必須添加它並將其設置爲False。