programing

Flask 서버에서 콘솔 메시지 사용 안 함

bestprogram 2023. 8. 10. 19:02

Flask 서버에서 콘솔 메시지 사용 안 함

서버를 모드 사용)로 .app.run()하지만 콘솔에 다음과 같은 메시지가 표시되는 것은 원치 않습니다.

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

상세 모드를 비활성화하려면 어떻게 해야 합니까?

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

수 이 솔 사 자 가 은 션 루 을 물 추 고 가 크 니 합 다 능 같 이 다 로 과 없 정 음 도 이 의 수 그 준 보 쌓 스 플 을 만 라 을 적 용 져 오 쇄 수 제 공 하 법 지 자 는 있 신 을 의 방 인 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

다른 답들은 모두 제게 맞지 않았지만, 저는 피터의 의견을 바탕으로 해결책을 찾았습니다.플라스크는 더 이상 사용하지 않습니다.logging클릭 패키지로 전환되었습니다.재정의함으로써click.echo그리고.click.secho 메시지를 크시메의시삭제다니습했를에서 했습니다.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그리고 빈 함수로 클릭 메서드를 재정의하면 모든 비오류 로그 출력을 방지해야 합니다.

억제하기Serving Flask app ...:

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

WSGI 서버를 사용하는 경우 로그를 없음으로 설정하십시오.

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

@Drewes 솔루션은 대부분 작동하지만 경우에 따라 werkzeug 로그가 생성되는 경향이 있습니다.만약 정말로 그들 중 누구도 보고 싶지 않다면, 저는 그렇게 그것을 비활성화하는 것을 제안합니다.

from flask import Flask
import logging

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

나에게 그것은 실패했습니다.abort(500)제기되었습니다.

MESSAGE(각자 및 모든 콘솔 메시지)를.abort(...)오류).

import os
import logging

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

이것은 기본적으로 Slava V와 Tom Wojcik이 제시한 답변의 조합입니다.

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

위의 제안도 작동하지 않았습니다. 앱 시작의 일부로 로거가 설정된 것 같습니다.앱을 시작한 후 로그 레벨을 변경하여 작동할 수 있었습니다.

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

도 불하게그도행그▁unfortun도.* Running on localhost:9151그리고 첫 번째 건강 점검은 여전히 표준화된 상태로 인쇄되지만, 많은 테스트를 실행할 때는 출력이 엄청나게 깨끗해집니다.

왜 "그럼왜?"?"log_names당신이 묻습니다.제 경우에는 제가 제거해야 할 여분의 통나무가 몇 개 있었습니다.다음을 통해 log_names에 추가할 로거를 찾을 수 있었습니다.

from flask import Flask
app = Flask(__name__)

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

참고 사항:플라스크앱.getLogger()나 다른 것이 있으면 좋을 것입니다. 그래서 이것은 여러 버전에 걸쳐 더 강력했습니다.아이디어 있어요?

추가 키워드: 플라스크 테스트 로그 제거 stdout 출력

덕분에:

여러가지 해결책으로 이 응답 로그들을 없애려고 노력했는데 알고 보니 플라스크 / Werkzeug가 아니라 Gunicorn 접속 로그가 stderr에 버려져 있었습니다.

솔루션은 Gunicorn 구성 파일에 다음 블록을 추가하여 기본 액세스 로그 처리기를 NullHandler로 교체했습니다.

logconfig_dict = {
    "version": 1,
    "disable_existing_loggers": False,
    "handlers": {
        "console": {"class": "logging.StreamHandler", "level": "INFO"},
        "null": {"class": "logging.NullHandler"},
    },
    "loggers": {
        "gunicorn.error": {"level": "INFO", "propagate": False, "handlers": ["console"]},
        "gunicorn.access": {"level": "INFO", "propagate": False, "handlers": ["null"]},
    },
}

어떻게든 위의 옵션 중 하나도 없습니다..disabled = True저를 위해 일했습니다.

하지만 다음은 효과가 있었습니다.

logging.getLogger('werkzeug').setLevel(logging.CRITICAL)

파이썬 3.7.3에서 2021년 11월 현재 최신 버전 사용:

pip3 list | grep -E "(connexion|Flask|Werkzeug)"
connexion2               2.10.0
Flask                    2.0.2
Werkzeug                 2.0.2

다음은 werkzeug 버전 2.1.0 이상을 포함한 모든 로깅을 비활성화하는 방법입니다.

import flask.cli
flask.cli.show_server_banner = lambda *args: None

import logging
logging.getLogger("werkzeug").disabled = True

2022-10년 현재 플라스크를 침묵시키기 위한 나의 현재 해결책.

그러면 로깅 및 시작 배너가 비활성화됩니다.

class WSServer:

    ...

    @staticmethod
    def _disabled_server_banner(*args, **kwargs):
        """
        Mock for the show_server_banner method to suppress spam to stdout
        """
        pass

    def _run_server(self):
        """
        Winds-up the server.
        """
        # disable general logging
        log = logging.getLogger('werkzeug') 
        log.setLevel(logging.CRITICAL)
        # disable start-up banner
        from flask import cli
        if hasattr(cli, "show_server_banner"):
            cli.show_server_banner = self._disabled_server_banner
        ...

동일한 로그 형식을 제공하기 위해 사용자 정의 로그와 플라스크 로그를 병합했습니다.

샘플 로그 메시지

자세한 내용은 https://github.com/senthilkumarimuth/logging_for_python .

print() 문 옆에 있는 콘솔에 로그인하는 것을 정말 원하지 않는 경우 이를 수행하는 강력한 방법은 다음과 같습니다.logging.basicConfig(level=logging.FATAL)이렇게 하면 치명적인 상태의 로그가 모두 비활성화됩니다.인쇄를 비활성화하지는 않겠지만, 네, 그냥 생각해 보세요 :/

편집: 저는 제가 사용한 문서에 링크를 붙이지 않는 것이 이기적일 것이라는 것을 깨달았습니다: https://docs.python.org/3/howto/logging.html#logging-basic-tutorial

첫 번째 요점:플라스크 공식 문서에 따르면 app.run()을 사용하여 플라스크 애플리케이션을 실행하면 안 됩니다.가장 좋은 해결책은 uwsgi를 사용하는 것이므로 "--disable-logging" 명령을 사용하여 기본 플라스크 로그를 사용하지 않도록 설정할 수 있습니다.

예:

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

언급URL : https://stackoverflow.com/questions/14888799/disable-console-messages-in-flask-server