Đủ dễ dàng để đặt dấu thời gian khi bắt đầu thực thi và tính toán thời lượng khi kết thúc. Bạn sẽ cần các lớp con đơn giản của LoggingConnection và LoggingCursor của riêng mình. Xem mã ví dụ của tôi.
Điều này dựa trên nguồn MinTimeLoggingConnection mà bạn có thể tìm thấy trong psycopg2/extras.py
nguồn.
import time
import psycopg2
import psycopg2.extensions
from psycopg2.extras import LoggingConnection, LoggingCursor
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
# MyLoggingCursor simply sets self.timestamp at start of each query
class MyLoggingCursor(LoggingCursor):
def execute(self, query, vars=None):
self.timestamp = time.time()
return super(MyLoggingCursor, self).execute(query, vars)
def callproc(self, procname, vars=None):
self.timestamp = time.time()
return super(MyLoggingCursor, self).callproc(procname, vars)
# MyLogging Connection:
# a) calls MyLoggingCursor rather than the default
# b) adds resulting execution (+ transport) time via filter()
class MyLoggingConnection(LoggingConnection):
def filter(self, msg, curs):
return msg + " %d ms" % int((time.time() - curs.timestamp) * 1000)
def cursor(self, *args, **kwargs):
kwargs.setdefault('cursor_factory', MyLoggingCursor)
return LoggingConnection.cursor(self, *args, **kwargs)
db_settings = {
....
}
query_txt = "[query_text_from file]"
conn = psycopg2.connect(connection_factory=MyLoggingConnection, **db_settings)
conn.initialize(logger)
cur = conn.cursor()
cur.execute(query_text)
và bạn sẽ nhận được:
DEBUG: __main__:[query] 3 ms
trong filter()
của bạn bạn có thể thay đổi định dạng hoặc chọn không hiển thị, nếu nhỏ hơn một số giá trị.