スタンドアロンモードで実行されているFlaskサーバーがあります(を使用app.run()
)。しかし、私はコンソールにメッセージを表示したくありません。
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
詳細モードを無効にするにはどうすればよいですか?
スタンドアロンモードで実行されているFlaskサーバーがあります(を使用app.run()
)。しかし、私はコンソールにメッセージを表示したくありません。
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
詳細モードを無効にするにはどうすればよいですか?
stderr
が、各HTTPトランザクションをログに記録しているだけで、私には関係ありません...
回答:
WerkzeugロガーのレベルをERRORに設定できます。その場合、エラーのみがログに記録されます。
import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
これは、OSX、Python 2.7.5、Flask0.10.0でテストされた完全に機能する例です。
from flask import Flask
app = Flask(__name__)
import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
click.secho
このソリューションは、独自のプリントとスタックトレースを取得する方法を提供しますが、フラスコからの情報レベルのログはありません。 127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200
from flask import Flask
import logging
app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
ログ出力を変更したいもう1つの理由は、テストのためであり、サーバーログをログファイルにリダイレクトします。
上記の提案も機能しませんでした。アプリの起動の一部としてロガーが設定されているようです。アプリの起動後にログレベルを変更することで、それを機能させることができました。
... (in setUpClass)
server = Thread(target=lambda: app.run(host=hostname, port=port, threaded=True))
server.daemon = True
server.start()
wait_for_boot(hostname, port) # curls a health check endpoint
log_names = ['werkzeug']
app_logs = map(lambda logname: logging.getLogger(logname), log_names)
file_handler = logging.FileHandler('log/app.test.log', 'w')
for app_log in app_logs:
for hdlr in app_log.handlers[:]: # remove all old handlers
app_log.removeHandler(hdlr)
app_log.addHandler(file_handler)
残念ながら、* Running on localhost:9151
最初のヘルスチェックは標準出力で出力されますが、多くのテストを実行すると、出力が1トンクリーンアップされます。
「それで、なぜlog_names
?」とあなたは尋ねます。私の場合、取り除く必要のある余分なログがいくつかありました。log_namesに追加するロガーを次の方法で見つけることができました。
from flask import Flask
app = Flask(__name__)
import logging
print(logging.Logger.manager.loggerDict)
補足:flaskapp.getLogger()などがあれば、バージョン間でより堅牢になると便利です。何か案は?
さらにいくつかのキーワード:フラスコテストログはstdout出力を削除します
おかげで:
他の答えはどれも私にとって正しく機能しませんでしたが、ピーターのコメントに基づいて解決策を見つけました。Flaskは明らかlogging
にロギングに使用しなくなり、クリックパッケージに切り替えました。オーバーライドすることによってclick.echo
、およびclick.secho
Iからフラスコの起動メッセージを排除しましたapp.run()
。
import logging
import click
from flask import Flask
app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
def secho(text, file=None, nl=None, err=None, color=None, **styles):
pass
def echo(text, file=None, nl=None, err=None, color=None, **styles):
pass
click.echo = echo
click.secho = secho
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
ログレベルをに設定してからERROR
、空の関数でクリックメソッドをオーバーライドするまでの間、エラー以外のログ出力をすべて防止する必要があります。
ブルートフォースあなたが本当に印刷()文の横にコンソールにログインするには何かがあるにしたくない場合は、それを行う方法logging.basicConfig(level=logging.FATAL)
。これにより、致命的なステータスのすべてのログが無効になります。印刷が無効になることはありませんが、考えてみてください:/
編集:使用したドキュメントへのリンクを配置しないのは利己的だと気づきました:) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial
最初のポイント:Flaskの公式ドキュメントによると、app.run()を使用してFlaskアプリケーションを実行しないでください。最善の解決策はuwsgiを使用することです。そのため、コマンド「--disable-logging」を使用してデフォルトのフラスコログを無効にできます。
例えば:
uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app