Einfach genug, um den Zeitstempel zu Beginn der Ausführung festzulegen und die Dauer am Ende zu berechnen. Sie benötigen Ihre eigenen einfachen Unterklassen von LoggingConnection und LoggingCursor. Siehe meinen Beispielcode.
Dies basiert auf der Quelle von MinTimeLoggingConnection, die Sie in psycopg2/extras.py
finden Quelle.
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)
und Sie erhalten:
DEBUG: __main__:[query] 3 ms
innerhalb Ihres filter()
Sie können die Formatierung ändern oder festlegen, dass sie nicht angezeigt werden, wenn sie unter einem bestimmten Wert liegen.