Tengo un servidor Flask ejecutándose en modo independiente (usando app.run()
). Pero no quiero ningún mensaje en la consola, como
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
¿Cómo desactivo el modo detallado?
Tengo un servidor Flask ejecutándose en modo independiente (usando app.run()
). Pero no quiero ningún mensaje en la consola, como
127.0.0.1 - - [15/Feb/2013 10:52:22] "GET /index.html HTTP/1.1" 200 -
...
¿Cómo desactivo el modo detallado?
stderr
pero solo registran cada transacción HTTP, algo irrelevante para mí ...
Respuestas:
Puede establecer el nivel del registrador Werkzeug en ERROR, en ese caso solo se registran los errores:
import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR)
Aquí hay un ejemplo completamente funcional probado en 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 solución le proporciona una forma de obtener sus propias impresiones y rastros de pila, pero sin registros de nivel de información de flask suck as 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
La solución @Drewes funciona la mayor parte del tiempo, pero en algunos casos, todavía tiendo a obtener registros werkzeug. Si realmente no quiere ver ninguno de ellos, le sugiero que lo desactive así.
from flask import Flask
import logging
app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
app.logger.disabled = True
Para mí falló cuando abort(500)
se planteó.
Otra razón por la que puede querer cambiar la salida del registro es para las pruebas y redirigir los registros del servidor a un archivo de registro.
Tampoco pude hacer que la sugerencia anterior funcionara, parece que los registradores están configurados como parte del inicio de la aplicación. Pude hacerlo funcionar cambiando los niveles de registro después de iniciar la aplicación:
... (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)
Desafortunadamente, la * Running on localhost:9151
primera y la primera verificación de estado todavía se imprimen en la salida estándar, pero cuando se ejecutan muchas pruebas, limpia la salida una tonelada.
"Entonces, ¿por qué log_names
?", Preguntas. En mi caso, había algunos registros adicionales de los que necesitaba deshacerme. Pude encontrar qué registradores agregar a log_names a través de:
from flask import Flask
app = Flask(__name__)
import logging
print(logging.Logger.manager.loggerDict)
Nota al margen: sería bueno si hubiera un flaskapp.getLogger () o algo así para que esto fuera más sólido en todas las versiones. ¿Algunas ideas?
Algunas palabras clave más: registro de prueba de matraz eliminar salida stdout
gracias a:
Ninguna de las otras respuestas me funcionó correctamente, pero encontré una solución basada en el comentario de Peter . Flask aparentemente ya no se usa logging
para el registro y ha cambiado al paquete de clic . Al anular click.echo
y click.secho
eliminé el mensaje de inicio de 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 establecer el nivel de registro en ERROR
y anular los métodos de clic con funciones vacías, se deben evitar todos los resultados del registro que no sean de error.
Respuesta tardía, pero encontré una manera de suprimir TODOS Y TODOS LOS MENSAJES DE LA CONSOLA (incluidos los que se muestran durante un abort(...)
error).
import os
import logging
logging.getLogger('werkzeug').disabled = True
os.environ['WERKZEUG_RUN_MAIN'] = 'true'
Esta es básicamente una combinación de las respuestas dadas por Slava V y Tom Wojcik.
Una forma de fuerza bruta de hacerlo si realmente no desea que nada inicie sesión en la consola además de las declaraciones print () es logging.basicConfig(level=logging.FATAL)
. Esto deshabilitaría todos los registros que están en estado fatal. No deshabilitaría la impresión, pero sí, solo un pensamiento: /
EDITAR: Me di cuenta de que sería egoísta de mi parte no poner un enlace a la documentación que usé :) https://docs.python.org/3/howto/logging.html#logging-basic-tutorial
El primer punto: de acuerdo con la documentación oficial de Flask, no debe ejecutar la aplicación Flask usando app.run (). La mejor solución es usar uwsgi, por lo que puede deshabilitar los registros de matraces predeterminados usando el comando "--disable-logging"
Por ejemplo:
uwsgi --socket 0.0.0.0:8001 --disable-logging --protocol=http -w app:app