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 2013

6
@DemianBrecht 문제는 ​​로그가 전송 stderr되지만 각 HTTP 트랜잭션을 로깅하고 있다는 것입니다. 저와는 관련이 없습니다 ...
ATOzTOA

답변:


130

Werkzeug 로거의 수준을 ERROR로 설정할 수 있습니다.이 경우 오류 만 기록됩니다.

import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)

다음은 OSX, Python 2.7.5, Flask 0.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"모듈 이름이 명확하게 표시됨 ").
rsb

2
나를 위해 작동합니다. 요청 디버그 메시지가 억제됩니다. Python 3.5.2, Flask 0.12 및 Werkzeug 0.11.11 사용
JackLeEmmerdeur

3
Python 3.6, Flask 0.12 및 Werkzeug 0.11.15에서도 작동합니다.
vallentin

8
안타깝게도 Flask 사용으로 인해 더 이상 완전히 작동하지 않습니다click.secho
Peter

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에서는 작동하지 않습니다.
Garrett

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

로깅 출력을 변경하려는 또 다른 이유는 테스트를위한 것이며 서버 로그를 로그 파일로 리디렉션하기위한 것입니다.

위의 제안도 작동하지 못했습니다. 로거가 앱 시작의 일부로 설정된 것 같습니다. 앱 시작한 로그 수준을 변경하여 작동시킬 수있었습니다 .

... (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첫 번째 상태 확인은 여전히 ​​표준 출력으로 인쇄되지만 많은 테스트를 실행하면 출력이 엄청나게 정리됩니다.

"그래서 왜 log_names?", 당신은 묻습니다. 제 경우에는 제거해야하는 추가 로그가있었습니다. 다음을 통해 log_names에 추가 할 로거를 찾을 수있었습니다.

from flask import Flask
app = Flask(__name__)

import logging
print(logging.Logger.manager.loggerDict)

참고 : flaskapp.getLogger () 또는 다른 버전이 있으면 좋을 것이므로 버전간에 더 강력합니다. 어떤 아이디어?

더 많은 키워드 : 플라스크 테스트 로그는 stdout 출력을 제거합니다.

덕분에 :


7

다른 답변 중 어느 것도 나를 위해 올바르게 작동하지 않았지만 Peter의 의견을 기반으로 해결책을 찾았습니다 . Flask는 더 이상 logging로깅에 사용하지 않으며 클릭 패키지 로 전환했습니다 . 재정의 click.echo하고 click.secho.NET에서 Flask의 시작 메시지를 제거했습니다 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'

이것은 기본적으로 Slava VTom 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.