2015-07-20 21 views
0

如果我有一個在Google App Engine中運行的python應用程序,如何在運行時動態更改應用程序的日誌記錄級別?應用程序的日誌級別目前通過日誌配置文件完成。如何在Google App Engine中動態更改python應用程序的日誌級別?

一個蠻力的方法是在本地更新日誌記錄配置文件,然後運行'appcfg.py -R update path_to_product'。但是這會更新所有修改過的文件。

有沒有更好的方法來做到這一點?

我看着dictConfig和fileConfig。但是使用這些方法不會更新正在運行的進程的日誌記錄配置(尤其是那些在不同應用程序引擎實例上運行的進程)

+1

我認爲你必須在數據存儲中存儲一個參數。你可以創建一個你從控制檯修改的'Settings'實體。您的日誌代碼將檢查設置實體並採取相應措施。 –

+1

只是一個快速提示:您應該使用/ _ah/start處理程序來檢查實例是否啓動並將配置存儲在環境變量中,以避免每次更改級別時往返數據存儲區。您還應提供更新日誌信息的方法,以通知已創建的實例,以便它們可以動態響應更改。 – Nick

+1

...或者你可以簡單地按日誌級別過濾你使用的任何日誌閱讀器,並將事情適當地記錄到他們的級別? – Nick

回答

1

您可以創建一個處理程序方法並調用它來在運行時動態設置日誌級別。

如:

def logLevel(self, request): 
     # ?value= NOTSET, DEBUG, INFO, WARN, ERROR, FATAL, CRITICAL 
     value = request.value.upper() if request.value else None 
     logging.info("Setting log level to: {}".format(value)) 
     logging.getLogger().setLevel(value) 
     logging.debug("Test debug") 
     logging.info("Test info") 
     logging.warn("Test warn") 
     logging.error("Test error") 
     logging.critical("Test critical") 

具體記錄儀也可以有針對性例如:

logging.getLogger('suds').setLevel(value) 

(請注意,在GAE啓動 '調試' 日誌默認情況下不顯示。)

+0

謝謝你,ChrisC73。假設應用程序在多個實例中部署並在Google App Engine中運行。那麼我怎麼會調用setLevel()或logLevel()?這樣做會影響已加載的所有模塊以及在所有實例中運行的現有進程嗎? – morfys

+1

@morfys您可能需要直接調用模塊(請參閱[這裏](https://cloud.google.com/appengine/docs/python/modules#Python_Communication_between_modules))。您可能需要在所有現有實例上調用此方法(請參閱同一頁面上的「實例可尋址性」)。雖然沒有做過。 – ChrisC73

相關問題