Flaskサーバーでコンソールメッセージを無効にする


90

スタンドアロンモードで実行されているFlaskサーバーがあります(を使用app.run())。しかし、私はコンソールにメッセージを表示したくありません。

127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...

詳細モードを無効にするにはどうすればよいですか?


これで、スレッドを開始するアプリができました(デバッグするのは十分に困難です)。そのでロギングを抑制しますか?Eesh、私がすることの反対のように聞こえます..ロギングが冗長であるほど良いです(明らかにそれが関連している限り;))。
Demian Brecht

6
@DemianBrecht問題は、ログはに送信されますstderrが、各HTTPトランザクションをログに記録しているだけで、私には関係ありません...
ATOzTOA 2013

回答:


130

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()

9
これは、HTTPログがstderrに送られるのを止めていないようです。。これは明らかに「ログ形式でモジュール名を「WERKZEUG」持っている「開始」メッセージ(停止DOES
RSB

2
私のために働きます。要求デバッグメッセージは抑制されます。Python 3.5.2、Flask 0.12、Werkzeug 0.11.11を使用
JackLeEmmerdeur

3
Python 3.6、Flask 0.12、Werkzeug0.11.15を使用しても機能します。
vallentin 2017年

8
残念ながら、Flaskを使用しているため、完全には機能しなくなりましたclick.secho
Peter

1
ロギングのレベルを変更することは、特定の1つのリクエストのみをロギングすることを回避するための解決策ではありません。
紳士

11

このソリューションは、独自のプリントとスタックトレースを取得する方法を提供しますが、フラスコからの情報レベルのログはありません。 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

これは、サーバーをローカルで実行している場合は機能しますが、Herokuでは奇妙なことに機能しません。
ギャレット

10

@Drewesソリューションはほとんどの場合機能しますが、場合によっては、それでもwerkzeugログを取得する傾向があります。本当に見たくない場合は、そのように無効にすることをお勧めします。

from flask import Flask
import logging

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
app.logger.disabled = True

私にとってabort(500)は、育てられたときに失敗しました。


8

WSGIサーバーを使用している場合は、ログを[なし]に設定してください

gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)

これが私のために働いた唯一の解決策であり、私はWSGIServerでFlaskを使用しています
Woody

7

ログ出力を変更したいもう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出力を削除します

おかげで:


7

他の答えはどれも私にとって正しく機能しませんでしたが、ピーターのコメントに基づいて解決策を見つけました。Flaskは明らかloggingにロギングに使用しなくなり、クリックパッケージに切り替えました。オーバーライドすることによってclick.echo、およびclick.sechoIからフラスコの起動メッセージを排除しました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、空の関数でクリックメソッドをオーバーライドするまでの間、エラー以外のログ出力をすべて防止する必要があります。


6

抑制するにはServing Flask app ...

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()

1
これは私にとってはうまくいきます。フラスコのアプリケーションをテストするときに使用しました(nose2を使用)。これにより、ターミナルの乱雑さが解消されます。おかげで
CPK

6

遅い答えですが、私はすべてのコンソールメッセージ(abort(...)エラー中に表示されたものを含む)を抑制する方法を見つけました。

import os
import logging

logging.getLogger('werkzeug').disabled = True
os.environ['WERKZEUG_RUN_MAIN'] = 'true'

これは基本的にによって与えられた回答の組み合わせであるスラバVトムWojcik


-1

ブルートフォースあなたが本当に印刷()文の横にコンソールにログインするには何かがあるにしたくない場合は、それを行う方法logging.basicConfig(level=logging.FATAL)。これにより、致命的なステータスのすべてのログが無効になります。印刷が無効になることはありませんが、考えてみてください:/

編集:使用したドキュメントへのリンクを配置しないのは利己的だと気づきました:) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial


-3

最初のポイント:Flaskの公式ドキュメントによると、app.run()を使用してFlaskアプリケーションを実行しないでください。最善の解決策はuwsgiを使用することです。そのため、コマンド「--disable-logging」を使用してデフォルトのフラスコログを無効にできます。

例えば:

uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.