简体   繁体   中英

How to use Flask dictConfig to log messages to a file

I am unable to log messages to a file in Flask using the below code:

from flask import Flask,request,jsonify
import requests
import logging
from logging.config import dictConfig

app = Flask(__name__)
app.config['SECRET_KEY'] = "Secret!"

dictConfig(
            {
    'version': 1,
    'formatters': {
            'default': {
                        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
                       },
            'simpleformatter' : {
                        'format' : '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
            }
    },
    'handlers': 
    {
        'wsgi': {
        'class': 'logging.StreamHandler',
        'formatter': 'default'
                },
        'custom_handler': {
        'class' : 'logging.FileHandler',
        'formatter': 'simpleformatter',
        'filename' : 'WARN.log'
        }
    },
    'root': {
        'level': 'INFO',
        'handlers': ['wsgi']
    },
    'MyExample': {
        'level': 'WARN',
        'handlers' : 'custom_handler'
    }
})

class InvalidUsage(Exception):
    status_code = 400

    def __init__(self, message, status_code=None, payload=None):
        Exception.__init__(self)
        self.message = message
        if status_code is not None:
            self.status_code = status_code
        self.payload = payload

    def to_dict(self):
        rv = dict(self.payload or ())
        rv['message'] = self.message
        rv['status_code'] = self.status_code
        return rv

@app.errorhandler(InvalidUsage)
def handle_invalid_usage(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

@app.route('/test',methods=["GET","POST"])
def test():
    url = "https://httpbin.org/status/404"
    try:
        response = requests.get(url)
        if response.status_code != 200:
            try:
                response.raise_for_status()
            except requests.exceptions.HTTPError:
                status = response.status_code
                print status
                raise InvalidUsage("An HTTP exception has been raised",status_code=status)
    except requests.exceptions.RequestException as e:
        app.logger.info("An exception has been raised")
        app.logger.info(e)
        raise InvalidUsage("request exception has been raised")

if __name__ == "__main__":
    app.run(debug=True)
    app.logger.getLogger('MyExample')

The last line : app.logger.getLogger('MyExample') gives an error saying that app.logger.getLogger('MyExample').

Since i have configured two different types of logger in my application root and MyExample how do i make sure that Flask should use MyExample logger to log messages.

Thanks in advance for any answers.

dictConfig(
        {
'version': 1,
'formatters': {
        'default': {
                    'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
                   },
        'simpleformatter' : {
                    'format' : '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
        }
},
'handlers': 
{
    'wsgi': {
    'class': 'logging.StreamHandler',
    'formatter': 'default'
            },
    'custom_handler': {
    'class' : 'logging.FileHandler',
    'formatter': 'simpleformatter',
    'filename' : 'WARN.log',
    'level'    : 'WARN'
    }
},
'root': {
    'level': 'INFO',
    'handlers': ['wsgi', 'custom_handler']
}})

Use your custom handler in root. Add level inside handlers. Now it will do both, store in log file & display on the console.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM