2013-09-27 52 views
1

我想臨時打開生產pyramid web項目中的調試消息,所以我調整了production.ini文件,將其推送到Heroku,只看到錯誤和警告級別的消息。爲什麼從paste.deploy使用loadapp時未使用日誌級別?

所以我覺得,這似乎很奇怪,因爲如果我在本地PC上啓動像以下這樣的金字塔應用程序,我會得到所有日誌級別的消息。

env/bin/pserve production.ini 

好了,這不是它究竟是如何運行在Heroku,它實際上是從little bit of python看起來像這樣運行(在一個名爲runapp.py文件):

import os 

from paste.deploy import loadapp 
from waitress import serve 

if __name__ == "__main__": 
    port = int(os.environ.get("PORT", 5000)) 
    app = loadapp('config:production.ini', relative_to='.') 

    serve(app, host='0.0.0.0', port=port) 

現在,肯定不夠的,如果我在本地PC上執行此操作時,我的行爲與部署到Heroku時的行爲相同(幾乎不奇怪)。

python runapp.py 

我的問題是,我在這裏錯過了什麼?爲什麼以第二種方式運行它將導致除ERROR和WARN之外的日誌消息被輸出爲標準輸出?當然,因爲它使用相同的production.ini文件,它應該與我使用pserve進程一樣工作?

這是我記錄部分從production.ini

### 
# logging configuration 
# http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html 
### 

[loggers] 
keys = root, test 

[handlers] 
keys = console 

[formatters] 
keys = generic 

[logger_root] 
level = DEBUG 
handlers = console 

[logger_test] 
level = DEBUG 
handlers = console 
qualname = test 

[handler_console] 
class = StreamHandler 
args = (sys.stderr,) 
level = DEBUG 
formatter = generic 

[formatter_generic] 
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s 

回答

4

PasteDeploy並不實際承擔配置日誌的責任。這是INI文件雙重目的的一個小問題。有些部分是PasteDeploy關心的,有些部分logging.config.fileConfig關心,並且都必須運行以完全加載INI文件。

如果按照這樣做的金字塔包裝,你會怎麼做:

pyramid.paster.setup_logging(inipath) 
pyramid.paster.get_app(inipath) 

主要的原因,你會用,而不是自己做這些是他們支持做「正確的事」的時候inipath包含像development.ini#myapp這樣的部分說明符,其中fileConfig會崩潰。

+0

很好,謝謝 - 那只是做這個工作。我用'import pyramid.paster'和'app = loadapp('config:production.ini',relative_to ='。')替換了這行:'paste.deploy import loadapp'只是傳遞給他們'production.ini'),它運行良好並且適用於我的日誌記錄,所以我是一個快樂的兔子:-)。 – kmp