web-dev-qa-db-ja.com

Flaskロギングがまったく機能しない

Flaskファイルと標準出力の両方にメッセージを記録しようとしています。公式のFlaskのドキュメントを読んでいて、これを思いつきました:

from flask import Flask
import logging
from logging import Formatter, FileHandler

app = Flask(__name__)



@app.route('/')
def hello_world():
    app.logger.debug('second test message...')
    return 'Hello World!'


if __name__ == '__main__':
    #Setup the logger
    file_handler = FileHandler('output.log')
    handler = logging.StreamHandler()
    file_handler.setLevel(logging.DEBUG)
    handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(Formatter(
        '%(asctime)s %(levelname)s: %(message)s '
        '[in %(pathname)s:%(lineno)d]'
     ))
     handler.setFormatter(Formatter(
        '%(asctime)s %(levelname)s: %(message)s '
        '[in %(pathname)s:%(lineno)d]'
     ))
     app.logger.addHandler(handler)
     app.logger.addHandler(file_handler)
     app.logger.error('first test message...')
     app.run()

いくつかの問題があります:

  1. 番号 output.logファイルが生成されます
  2. 最初のロギングメッセージのみが機能します。

    app.logger.error( 'testing ...')

そしてstdoutでのみ...ビュー "/"の1つだけがstdoutに出力されません...私は何か間違っていますか?

これは、アプリを起動して/に移動した場合の出力です。

2015-03-08 11:33:27,183 ERROR: first test message... [in /home/mosquito/python_projects/flask_tst/flask_tst.py:31]
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [08/Mar/2015 11:33:43] "GET / HTTP/1.1" 200 -
18
AlejandroVK

デバッグモードで実行していないため、(デバッグ)ログメッセージがFlask)によって抑制されています。次のフラグをTrueに設定すると、コードは機能します。

    app.run(debug=True)

メッセージは期待どおりに表示されます。

BennyE$ python3 stackoverflow.py 
2015-03-08 12:04:04,650 ERROR: firs test message... [in stackoverflow.py:31]
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
2015-03-08 12:04:04,807 ERROR: firs test message... [in stackoverflow.py:31]
--------------------------------------------------------------------------------
DEBUG in stackoverflow [stackoverflow.py:11]:
second test message...
--------------------------------------------------------------------------------
2015-03-08 12:04:13,789 DEBUG: second test message... [in stackoverflow.py:11]
192.168.178.23 - - [08/Mar/2015 12:04:13] "GET / HTTP/1.1" 200 -
--------------------------------------------------------------------------------
DEBUG in stackoverflow [stackoverflow.py:11]:
second test message...
--------------------------------------------------------------------------------
2015-03-08 12:04:14,899 DEBUG: second test message... [in stackoverflow.py:11]
192.168.178.23 - - [08/Mar/2015 12:04:14] "GET / HTTP/1.1" 200 -

これは、関連する出力ファイルの出力です。

BennyE$ cat output.log 
2015-03-08 11:58:22,226 ERROR: firs test message... [in stackoverflow.py:31]
2015-03-08 12:04:04,650 ERROR: firs test message... [in stackoverflow.py:31]
2015-03-08 12:04:04,807 ERROR: firs test message... [in stackoverflow.py:31]
2015-03-08 12:04:13,789 DEBUG: second test message... [in stackoverflow.py:11]
2015-03-08 12:04:14,899 DEBUG: second test message... [in stackoverflow.py:11]
23
BennyE_HH

Thansk BennyE_HH、動作します。

ただし、Flaskは、デバッグモードが無効(デフォルトは無効)であっても、ERRORレベルのログメッセージを抑制しませんでした。

デバッグモードがfalseの場合でも、app.logger.setLevel(logging.DEBUG)を呼び出してログレベルを制御する必要があると思います。

5
allen.bang

私は同じ問題を抱えており、以下が私のために働きました:

app.logger.setLevel(logging.INFO)
3
kashaziz