Eu tenho um servidor Flask em execução no modo autônomo (usando app.run()
). Mas, eu não quero nenhuma mensagem no console, como
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
Como eu desativo o modo detalhado?
Eu tenho um servidor Flask em execução no modo autônomo (usando app.run()
). Mas, eu não quero nenhuma mensagem no console, como
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
Como eu desativo o modo detalhado?
stderr
mas eles apenas registram cada transação HTTP, meio irrelevante para mim ...
Respostas:
Você pode definir o nível do registrador Werkzeug para ERROR, nesse caso, apenas os erros são registrados:
import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
Aqui está um exemplo totalmente funcional testado em 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()
click.secho
Esta solução fornece uma maneira de obter suas próprias impressões e rastreamentos de pilha, mas sem registros de nível de informação do frasco de sucção como 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
A solução @Drewes funciona na maioria das vezes, mas, em alguns casos, ainda tenho a tendência de obter logs de werkzeug. Se você realmente não quiser ver nenhum deles, sugiro que desative-o assim.
from flask import Flask
import logging
app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
app.logger.disabled = True
Para mim, falhou quando abort(500)
foi criado.
Nenhuma das outras respostas funcionou corretamente para mim, mas encontrei uma solução com base no comentário de Peter . O Flask aparentemente não usa mais logging
para registro e mudou para o pacote de cliques . Substituindo click.echo
e click.secho
eliminei a mensagem de inicialização do Flask de 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()
Entre definir o nível de registro ERROR
e substituir os métodos de clique com funções vazias, todas as saídas de registro sem erros devem ser evitadas.
Outro motivo pelo qual você pode querer alterar a saída de log é para testes e redirecionar os logs do servidor para um arquivo de log.
Eu também não consegui fazer a sugestão acima funcionar, parece que os loggers são configurados como parte da inicialização do aplicativo. Consegui fazê-lo funcionar alterando os níveis de registro após iniciar o aplicativo:
... (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)
Infelizmente, o * Running on localhost:9151
e a primeira verificação de integridade ainda é impressa de acordo com os padrões, mas ao executar muitos testes, ela limpa a saída em uma tonelada.
"Então, por quê log_names
?", Você pergunta. No meu caso, havia alguns logs extras dos quais eu precisava me livrar. Consegui encontrar quais registradores adicionar a log_names por meio de:
from flask import Flask
app = Flask(__name__)
import logging
print(logging.Logger.manager.loggerDict)
Nota lateral: seria bom se houvesse um flaskapp.getLogger () ou algo assim, para que fosse mais robusto em todas as versões. Alguma ideia?
Mais algumas palavras-chave: log de teste de flask remove saída stdout
graças a:
Resposta tardia, mas encontrei uma maneira de suprimir CADA E TODAS AS MENSAGENS DO CONSOLE (incluindo as exibidas durante um abort(...)
erro).
import os
import logging
logging.getLogger('werkzeug').disabled = True
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
Esta é basicamente uma combinação das respostas dadas por Slava V e Tom Wojcik
Uma maneira de força bruta de fazer isso se você realmente não quiser que nada entre no console ao lado das instruções print () é logging.basicConfig(level=logging.FATAL)
. Isso desabilitaria todos os logs com status fatal. Não desabilitaria a impressão, mas sim, apenas um pensamento: /
EDITAR: Percebi que seria egoísmo da minha parte não colocar um link para a documentação que usei :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial
O primeiro ponto: de acordo com a documentação oficial do Flask, você não deve executar o aplicativo Flask usando app.run (). A melhor solução é usar uwsgi, então você pode desabilitar os logs de flask padrão usando o comando "--disable-logging"
Por exemplo:
uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app