2016-02-14 16 views
6

我檢查logging.Logger.manager.loggerDict做:什麼是celery.utils.log.ProcessAwareLoggerobject做在logging.Logger.manager.loggerDict

import logging 
logging.Logger.manager.loggerDict 

和字典如下:

{ 
    'nose.case': <celery.utils.log.ProcessAwareLoggerobjectat0x112c8dcd0>, 
    'apps.friends': <logging.PlaceHolderobjectat0x1147720d0>, 
    'oauthlib.oauth2.rfc6749.grant_types.client_credentials': <celery.utils.log.ProcessAwareLoggerobjectat0x115c48710>, 
    'apps.adapter.views': <celery.utils.log.ProcessAwareLoggerobjectat0x116a847d0>, 
    'apps.accounts.views': <celery.utils.log.ProcessAwareLoggerobjectat0x116976990>, 

    } 
    There are more but I truncated it 

我的問題是:

  1. 爲什麼芹菜參與各種其他非芹菜應用程序的日誌記錄?是否因爲日誌記錄是以異步方式完成的,並且以某種方式記錄框架檢測到芹菜的存在並使用它?
  2. 對於我自己的兩個使用logger = logging.getLogger(__name__)進行日誌記錄的文件,我看到一個是PlaceHolderObject,另外兩個是celery.utils.log.ProcessAwareLogger對象 - 儘管後兩個文件在視圖中調用,而不是在芹菜進程中調用。它是怎麼變成這個樣子,然後

感謝

回答

5

芹菜本身替換(全局)記錄器類,使用logging.setLoggerClass方法,用ProcessAwareLogger類,做了幾件事情:避免嘗試登錄,而在一個信號處理程序,併爲日誌添加進程名稱。一旦芹菜的記錄系統建立,就會發生這種情況。由於setLoggerClass的全球性,您甚至可以在自己的記錄儀上看到此課程。至於爲什麼,正如Celery那樣設計的,我想你得問一個Celery的開發者,但它實際上允許Celery確保信號處理程序的安全性和程序名被照顧,即使你在您的應用程序中使用您自己的記錄器。

蟒蛇logging文檔注意:

如果要實現使用信號模塊異步信號處理程序,你可能無法使用日誌從這樣的處理程序中。這是因爲線程模塊中的鎖實現並不總是可重入的,所以不能從這些信號處理程序中調用。

芹菜使用signal所以這可能是想要全球執行其記錄器類的原因。

+0

我很長時間一直對ProcessAwareLogger感到困惑,感謝您的解釋。 – dalang