sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan får jeg psycopg2-logning af forespørgselsudførelsestid?

Let nok til at indstille tidsstempel ved start af udførelse og beregne varighed ved afslutning. Du skal bruge dine egne simple underklasser af LoggingConnection og LoggingCursor. Se min eksempelkode.

Dette er baseret på kilden til MinTimeLoggingConnection, som du kan finde i psycopg2/extras.py kilde.

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)

og du får:

DEBUG: __main__:[query]     3 ms

i dit filter() du kan ændre formateringen eller vælge ikke at vise, hvis mindre end en værdi.




  1. Hvordan tester man en Oracle Stored Procedure med RefCursor returtype?

  2. Operatør

  3. Sammenligning af høj tilgængelighed af databaser - MySQL / MariaDB-replikering vs Oracle Data Guard

  4. PostgreSQL matematiske funktioner