Cukup mudah untuk mengatur stempel waktu di awal eksekusi dan menghitung durasi di akhir. Anda memerlukan subkelas LoggingConnection dan LoggingCursor sederhana Anda sendiri. Lihat kode contoh saya.
Ini didasarkan pada sumber MinTimeLoggingConnection yang dapat Anda temukan di psycopg2/extras.py
sumber.
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)
dan Anda akan mendapatkan:
DEBUG: __main__:[query] 3 ms
dalam filter()
. Anda Anda dapat mengubah pemformatan, atau memilih untuk tidak menampilkan, jika kurang dari nilai tertentu.