web 項目之中慢查詢定位查詢sql語句


web 項目之中慢查詢的使用(flask為例):
1,如果只是看msql的慢查詢的日志在的項目之中很難定位問題
2,可以借用 SQLALCHEMY_RECORD_QUERIES 與 DATABASE_QUERY_TIMEOUT 將慢查詢以及相關的上下文信息記錄到日志中
3,代碼邏輯:
1),啟用查詢記錄功能
2),app.logger 增加一個記錄日志的處理器
3),每次請求后,超過閾值的存儲到日志中去
# coding=utf-8
import logging
from logging.handlers import RotatingFileHandler

from flask import Flask, request, jsonify
from flask_sqlalchemy import get_debug_queries

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
from users import User

app = Flask(__name__)
app.config.from_object('config')
# 配置查詢超時時間
app.config['DATABASE_QUERY_TIMEOUT'] = 0.0001
# 保存查詢記錄
app.config['SQLALCHEMY_RECORD_QUERIES'] = True
db.init_app(app)

# 增加一個日志記錄
formatter = logging.Formatter(
    "[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s")
handler = RotatingFileHandler('slow_query.log', maxBytes=10000, backupCount=10)
handler.setLevel(logging.WARN)
handler.setFormatter(formatter)
app.logger.addHandler(handler)

with app.app_context():
    db.drop_all()
    db.create_all()


@app.route('/users', methods=['POST'])
def users():
    username = request.form.get('name')

    user = User(username)
    print 'User ID: {}'.format(user.id)
    db.session.add(user)
    db.session.commit()
    return jsonify({'id': user.id})

# 請求鈎子
@app.after_request
def after_request(response):
    for query in get_debug_queries():
        # 如果超出查詢時間,那么記錄到日志之中!
        if query.duration >= app.config['DATABASE_QUERY_TIMEOUT']:
            app.logger.warn(
                ('\nContext:{}\nSLOW QUERY: {}\nParameters: {}\n'
                 'Duration: {}\n').format(query.context, query.statement,
                                          query.parameters, query.duration))
    return response

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9000)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM