¿Entonces ahora tiene una aplicación que inicia subprocesos (que son lo suficientemente difíciles de depurar ellos mismos) y ahora va a suprimir el registro además de eso? Eesh, suena como lo opuesto a lo que haría yo. Cuanto más detallado sea el registro, mejor (obviamente, siempre que sea relevante;)).
Demian Brecht
6
@DemianBrecht La cuestión es que los registros se envían stderrpero solo registran cada transacción HTTP, algo irrelevante para mí ...
ATOzTOA
Respuestas:
131
Puede establecer el nivel del registrador Werkzeug en ERROR, en ese caso solo se registran los errores:
Esto no parece evitar que los registros HTTP vayan a stderr; SÍ detiene el mensaje de "inicio" (que claramente tiene el nombre del módulo "werkzeug" en el formato de registro ".
rsb
2
Funciona para mi. Se suprimen los mensajes de depuración de solicitud. Usando Python 3.5.2, Flask 0.12 y Werkzeug 0.11.11
JackLeEmmerdeur
3
También funciona con Python 3.6, Flask 0.12 y Werkzeug 0.11.15.
Vallentin
8
Desafortunadamente, ya no funciona completamente debido al uso de Flaskclick.secho
Peter
1
Cambiar el nivel de registro no debería ser la solución para evitar registrar solo una solicitud en particular.
gented el
11
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
Esto funciona cuando se ejecuta mi servidor localmente, pero extrañamente en Heroku, no es así.
Garrett
10
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í.
Esta es la única solución que funcionó para mí, y uso Flask con WSGIServer
Woody
7
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:9151primera 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
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 loggingpara el registro y ha cambiado al paquete de clic . Al anular click.echoy click.sechoeliminé el mensaje de inicio de Flask de app.run().
Entre establecer el nivel de registro en ERRORy anular los métodos de clic con funciones vacías, se deben evitar todos los resultados del registro que no sean de error.
Esto funciona para mí, lo usé cuando probaba la aplicación del matraz (usando nose2) esto elimina el desorden en la terminal. Gracias
CpK
6
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: /
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"
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()
fuente
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
fuente
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ó.fuente
En caso de que esté utilizando el servidor WSGI, configure el registro en Ninguno
gevent_server = gevent.pywsgi.WSGIServer(("0.0.0.0", 8080), app,log = None)
fuente
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:
fuente
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 anularclick.echo
yclick.secho
eliminé el mensaje de inicio de Flask deapp.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.fuente
Para suprimir
Serving Flask app ...
:os.environ['WERKZEUG_RUN_MAIN'] = 'true' app.run()
fuente
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.
fuente
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
fuente
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
fuente