2015-01-06 69 views
1

分開我有一個應用程序的CherryPy並啓用日誌記錄(接入和應用程序文件)。記錄從CherryPy的記錄

conf = {'/': 
    { 
     'tools.staticdir.on': True, 
     'tools.staticdir.dir': WEB_ROOT, 
     'tools.staticdir.index': 'debug_registers2.html', 
     'log.access_file': ACCESS_LOG, 
     'log.error_file': APP_LOG, 
    } 
} 

除了默認CherryPy的日誌數據,我也使用像語句:

cherrypy.log("My text here") 

現在我需要創建一個3日誌文件,我將一些其他的數據傳遞給。 如果我做的:

logging.basicConfig(filename=SPI_LOG,level=logging.DEBUG) 
logging.debug('This message should go to the SPI log file') 

我CherryPy的日誌數據也進入 「SPI_LOG」 文件。

我如何保持兩個獨立的?

回答

0

不要使用根記錄(其中,作爲CP的記錄器的父母,也接收了所有消息)。創建一個logging.getLogger('myapp')的孩子。而不是調用basicConfig()你必須單獨setLevel()和創建,配置和附加FileHandlerFormatter

1

默認情況下,CherryPy的有如下記錄結構:

  • "cherrypy.error"記錄儀,用它自己的處理程序。
  • "cherrypy.access"記錄器,有它自己的處理程序。
  • "cherrypy"記錄器,也就是從兩個第一批家長,並接受他們的日誌,但沒有任何處理程序相關聯。

  • 和永遠不存在的"root"記錄器,它是來自"cherrypy"記錄器的父代,沒有處理器關聯。

1)因此,與此配置中,CherryPy的寫入日誌到錯誤和訪問日誌。這些日誌由其各自的處理程序捕獲並顯示。如果您使用cherrypy.log(),您將從"cherrypy.error"發送日誌。

所有日誌也發送到"cherrypy"然後"root"記錄器,但它沒有任何處理器的影響,因爲它沒有處理器。

2)後,如果您使用logging.error()從您的應用程序,爲根日誌中創建一個處理程序,並記錄發送給它。此根處理程序將因此顯示您的日誌和cherrypy日誌。您的日誌將會出現一次,並且cherrypy日誌將出現兩次,一次通過它們自己的處理程序,然後通過根處理程序處理消息。您可以看到處理程序不同,因爲cherrypy處理程序是自定義的(時間戳記),並且自動根處理程序具有其他格式。

3)如果您爲應用程序創建一個記錄和日誌,通過它,

local_logger=logging.getLogger("my logger") 

消息將不會出現,因爲它沒有任何處理呢,則消息被傳遞到根記錄器(也父「我的記錄器」)沒有任何處理程序關聯。

4)如果您創建一個記錄器爲您的應用程序並調用logging.basicConfig(),它將爲根記錄器的處理程序,你會在相同的情況下2)

5)最後,如果你創建一個記錄儀爲您的應用

local_logger=logging.getLogger("my logger") 

,然後創建一個處理程序,它

local_logger.addHandler(logging.StreamHandler()) 

那麼你的日誌,它會通過它的處理程序顯示出來,然後發送到根日誌記錄器,以及已處理的cherrypy日誌,但在此級別,它們都不會再次顯示,因爲根日誌記錄器仍然沒有與其關聯的處理程序!這就是你想要的。要使用文件而不是控制檯輸出,只需選擇另一類處理程序。

這讓我永遠想弄清楚所有這些工作,並與櫻桃雙日誌和我的不顯示,並在所有不同的格式和所有!我發現它沒有清楚地解釋,所以我希望這有助於!

+0

只需在文件頂部設置'logging.getLogger(「cherrypy」)。propagate = False'就不會在屏幕上看到cherrypy日誌。 有關演示,請參閱:https://github.com/cherrypy/cherrypy/issues/1566#issuecomment-296993493 –