How do I write Flask's excellent debug log message to a file in production?

前端 未结 5 1908
囚心锁ツ
囚心锁ツ 2020-12-22 17:29

I have a Flask application that works well and produces an occasional error, which is visible when it is running with debug=True:

if __name__ =         


        
5条回答
  •  执笔经年
    2020-12-22 18:10

    I don't know why it's not working but I can tell how am doing this.

    First of all, you don't need to set the level of app.logger. So remove this line app.logger.setLevel().

    You want to save exception and return error page for every view. It is a lot of work to write this code everywhere. Flask provides a method to do this. Define an errorhandler method like this.

        @app.errorhandler(500)
        def internal_error(exception):
            app.logger.error(exception)
            return render_template('500.html'), 500
    

    Whenever a view raises an exception, this method will be called and passed the exception as argument. Python logging provides exception method that is used to save full traceback of the exception.

    Since this handles all exception, you don't even need to put code in try/except block. Though, if you want to do something before calling the errorhandler(for e.g. rollback session or transaction) then do this:

        try:
            #code
        except:
            #code
            raise
    

    If you would like the date and time added for each entry in your log file, the following code can be used (in place of the similar code featured in the question).

    if app.debug is not True:   
        import logging
        from logging.handlers import RotatingFileHandler
        file_handler = RotatingFileHandler('python.log', maxBytes=1024 * 1024 * 100, backupCount=20)
        file_handler.setLevel(logging.ERROR)
        formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
        file_handler.setFormatter(formatter)
        app.logger.addHandler(file_handler)
    

提交回复
热议问题