【问题标题】:Setting up a database handler for flask logger为烧瓶记录器设置数据库处理程序
【发布时间】:2018-10-09 20:35:02
【问题描述】:

我希望设置一个日志数据库处理程序,它将保存 Flask 当前输出到控制台的所有信息(未处理的异常、werkzeug、sqlachemy)以及我的自定义日志消息。

我在设置这一切时遇到了麻烦。问题:

1) 为什么 about 视图中的模拟算术错误没有被任何记录器拾取?

2) 为什么 werkzeug 记录器不能正确显示加载的服务器,并且只输出模拟 Aritmetic 错误的“请求 %s 错误”。

3) 有没有更简单的方法将 Flask 服务器(及其组件)写入的所有内容通过管道传输到数据库?

感谢您的回复和任何其他建议。

到目前为止我做了什么:

models.py

class Log(DB.Model):
    __tablename__ = 'logs'
    id = DB.Column(DB.Integer, primary_key=True) # auto incrementing
    logger = DB.Column(DB.String(100)) # the name of the logger. (e.g. myapp.views)
    level = DB.Column(DB.String(100)) # info, debug, or error?
    trace = DB.Column(DB.String(4096)) # the full traceback printout
    msg = DB.Column(DB.String(4096)) # any custom log you may have included
    created_at = DB.Column(DB.DateTime, default=DB.func.now()) # the current timestamp

    def __init__(self, logger=None, level=None, trace=None, msg=None):
        self.logger = logger
        self.level = level
        self.trace = trace
        self.msg = msg

    def __unicode__(self):
        return self.__repr__()

    def __repr__(self):
        return "<Log: %s - %s>" % (self.created_at.strftime('%m/%d/%Y-%H:%M:%S'), self.msg[:50])

core.py

"""
This module contains the core objects of the application:
the Flask (APP) object and the database object.
"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from samo.config import CONFIG_BY_NAME, ENVIRONMENT


APP = Flask(__name__)
APP.config.from_object('samo.config')
APP.config.from_object(CONFIG_BY_NAME[ENVIRONMENT])

DB = SQLAlchemy(APP)
DB.create_all()

LOGIN_MANAGER = LoginManager()
LOGIN_MANAGER.init_app(APP)
LOGIN_MANAGER.session_protection = "strong"
LOGIN_MANAGER.login_view = "auth.login"

run.py

from samo.core import APP as app, DB
from flask_wtf.csrf import CSRFProtect
from samo.config import config
from samo.models import Log
import traceback
import logging

class SQLAlchemyHandler(logging.Handler):

    def emit(self, record):
        trace = None
        exc = record.__dict__['exc_info']
        if exc:
            trace = traceback.format_exc(exc)
        log = Log(
            logger=record.__dict__['name'],
            level=record.__dict__['levelname'],
            trace=trace,
            msg=record.__dict__['msg'],)
        DB.session.add(log)
        DB.session.commit()

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

ch = SQLAlchemyHandler()
ch.setLevel(logging.INFO)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)



loggers = [logger, logging.getLogger('werkzeug'),  logging.getLogger('sqlalchemy'), logging.getLogger('flask.app')]

for l in loggers:
    l.addHandler(ch)

csrf = CSRFProtect()

if __name__ == '__main__':

    csrf.init_app(app)
    logger.critical('TEST CRITICAL ERROR')
    app.run(host=config['ENV']['HOST'])

views.py

@APP.route('/about')
def about():
    """
    Renders the about page.

    :return: html template
    """

    search = SearchForm(request.form)

    raise ArithmeticError('A nasty error')

    return render_template('about.html', postsearchform=search)

数据库中插入了什么

【问题讨论】:

    标签: python python-3.x flask


    【解决方案1】:

    如果有人偶然发现这个

    在 run.py 中,这是我为达到预期结果所做的唯一更改。

    from samo.core import APP as app, DB
    from flask_wtf.csrf import CSRFProtect
    from samo.config import config
    from samo.models import Log
    import traceback
    import logging
    
    class SQLAlchemyHandler(logging.Handler):
    
        def emit(self, record):
            trace = None
            exc = record.__dict__['exc_info']
            if exc:
                trace = traceback.format_exc() ##CHANGE HERE, removed exc parameter
            log = Log(
                logger=record.__dict__['name'],
                level=record.__dict__['levelname'],
                trace=trace,
                msg=record.__dict__['msg'],)
            DB.session.add(log)
            DB.session.commit()
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    
    ch = SQLAlchemyHandler()
    ch.setLevel(logging.INFO)
    
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    ch.setFormatter(formatter)
    
    
    
    loggers = [logger, logging.getLogger('werkzeug'),  logging.getLogger('sqlalchemy'), logging.getLogger('flask.app')]
    
    for l in loggers:
        l.addHandler(ch)
    
    csrf = CSRFProtect()
    
    if __name__ == '__main__':
    
        csrf.init_app(app)
        logger.critical('TEST CRITICAL ERROR')
        app.run(host=config['ENV']['HOST'])
    

    问题解决了。

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      相关资源
      最近更新 更多