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)