Estoy usando python 3.7.3, con matraz versión 1.0.2.
Al ejecutar mi archivo app.py sin las siguientes importaciones:
import logging logging.basicConfig(filename='api.log',level=logging.DEBUG)
Flask mostrará información de depuración relevante en la consola, como solicitudes POST/GET y de qué IP provienen.
Tan pronto como se habilita el registro DEBUG, ya no recibo este resultado. He intentado ejecutar mi aplicación en modo de depuración:
app.run(host='0.0.0.0', port=80, debug=True)
Pero esto produce los mismos resultados. ¿Hay alguna forma de habilitar tanto la salida de la consola como el registro de Python? Esto puede sonar como una solicitud tonta, pero me gustaría usar la consola con fines de demostración, mientras tengo el archivo de registro presente para la resolución de problemas.
Flask tiene un registrador incorporado al que se puede acceder mediante app.logger
. Es solo una instancia de la clase logging.Logger
de la biblioteca estándar, lo que significa que puede usarla como lo haría normalmente con el registrador básico. La documentación para ello está aquí .
Para que el registrador incorporado escriba en un archivo, debe agregar un logging.FileHandler
al registrador. Establecer debug=True
en app.run
, inicia el servidor de desarrollo, pero no cambia el nivel de registro para depurar. Como tal, deberá establecer el nivel de registro en logging.DEBUG
manualmente.
Ejemplo:
import logging from flask import Flask app = Flask(__name__) handler = logging.FileHandler("test.log") # Create the file logger app.logger.addHandler(handler) # Add it to the built-in logger app.logger.setLevel(logging.DEBUG) # Set the log level to debug @app.route("/") def index(): app.logger.error("Something has gone very wrong") app.logger.warning("You've been warned") app.logger.info("Here's some info") app.logger.debug("Meaningless debug information") return "Hello World" app.run(host="127.0.0.1", port=8080)
Si luego mira el archivo de registro, debería tener las 4 líneas impresas y la consola también tendrá las líneas.
Encontré una solución:
import logging from flask import Flask app = Flask(__name__) logger = logging.getLogger('werkzeug') # grabs underlying WSGI logger handler = logging.FileHandler('test.log') # creates handler for the log file logger.addHandler(handler) # adds handler to the werkzeug WSGI logger @app.route("/") def index(): logger.info("Here's some info") return "Hello World" if __name__ == '__main__': app.run(host='0.0.0.0', port=80)
Otros ejemplos:
# logs to console, and log file logger.info("Some text for console and log file") # prints exception, and logs to file except Exception as ue: logger.error("Unexpected Error: malformed JSON in POST request, check key/value pair at: ") logger.error(ue)
Fuente: https://docstrings.wordpress.com/2014/04/19/flask-access-log-write-requests-to-file/
Si el enlace está roto:
Puede estar confundido porque agregar un controlador a app.logger de Flask no capta el resultado que ve en la consola como:
127.0.0.1 - - [19/Apr/2014 18:51:26] "GET / HTTP/1.1" 200 -
Esto se debe a que app.logger es para Flask y esa salida proviene del módulo WSGI subyacente, Werkzeug.
Para acceder al registrador de Werkzeug, debemos llamar a logging.getLogger() y darle el nombre que usa Werkzeug. Esto nos permite registrar solicitudes en un registro de acceso utilizando lo siguiente:
logger = logging.getLogger('werkzeug') handler = logging.FileHandler('access.log') logger.addHandler(handler) # Also add the handler to Flask's logger for cases # where Werkzeug isn't used as the underlying WSGI server. # This wasn't required in my case, but can be uncommented as needed # app.logger.addHandler(handler)
Por supuesto, puede agregar su propio formato y otros controladores.