Deshabilitar los mensajes de la consola en el servidor Flask

90

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?

ATOzTOA
fuente
¿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:

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()
Drewes
fuente
9
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

from flask import Flask
import logging

app = Flask(__name__)
log = logging.getLogger('werkzeug')
log.disabled = True
iamtodor
fuente
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í.

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ó.

Tom Wojcik
fuente
8

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)
Ami
fuente
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

gracias a:

daicoden
fuente
7

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

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 ERRORy anular los métodos de clic con funciones vacías, se deben evitar todos los resultados del registro que no sean de error.

Brendan Burkhart
fuente
6

Para suprimir Serving Flask app ...:

os.environ['WERKZEUG_RUN_MAIN'] = 'true'
app.run()
Slava V
fuente
1
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.

progyammer
fuente
-1

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

Estado profundo de negación
fuente
-3

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

Anton Erjomin
fuente