• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Pruebas Online
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

537
Vistas
Python, Flask print to console and log file simultaneously

I'm using python 3.7.3, with flask version 1.0.2.

When running my app.py file without the following imports:

import logging
logging.basicConfig(filename='api.log',level=logging.DEBUG)

Flask will display relevant debug information to console, such as POST/GET requests and which IP they came from.

As soon as DEBUG logging is enabled, I no longer receive this output. I have tried running my application in debug mode:

app.run(host='0.0.0.0', port=80, debug=True)

But this produces the same results. Is there a way to have both console output, and python logging enabled? This might sound like a silly request, but I would like to use the console for demonstration purposes, while having the log file present for troubleshooting.

about 3 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Flask has a built-in logger that can be accessed using app.logger. It is just an instance of the standard library logging.Logger class which means that you are able to use it as you normally would the basic logger. The documentation for it is here.

To get the built-in logger to write to a file, you have to add a logging.FileHandler to the logger. Setting debug=True in app.run, starts the development server, but does not change the log level to debug. As such, you'll need to set the log level to logging.DEBUG manually.

Example:

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)

If you then look at the log file, it should have all 4 lines printed out in it and the console will also have the lines.

about 3 years ago · Santiago Trujillo Denunciar

0

Found a solution:

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)

Other Examples:

# 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)

Source: https://docstrings.wordpress.com/2014/04/19/flask-access-log-write-requests-to-file/

If link is broken:

You may be confused because adding a handler to Flask’s app.logger doesn’t catch the output you see in the console like:

127.0.0.1 - - [19/Apr/2014 18:51:26] "GET / HTTP/1.1" 200 -

This is because app.logger is for Flask and that output comes from the underlying WSGI module, Werkzeug.

To access Werkzeug’s logger we must call logging.getLogger() and give it the name Werkzeug uses. This allows us to log requests to an access log using the following:

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) 

You can of course add your own formatting and other handlers.

about 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda