26

I'd like to log the queries that psycopg2 is making, but the psycopg2 documentation doesn't really specify how LoggingConnection should be used.

import logging
from psycopg2.extras import LoggingConnection

db_settings = {
    "user": "abcd",
    "password": "efgh",
    "host": "postgres.db",
    "database": "dev",
}

conn = LoggingConnection(**db_settings)

Gives an error

LoggingConnection(**db_settings) TypeError: function takes at most 2 arguments (5 given)

k107
  • 15,882
  • 11
  • 61
  • 59

2 Answers2

38

Seems like setting the connection_factory=LoggingConnection works

import logging
import psycopg2
from psycopg2.extras import LoggingConnection

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

db_settings = {
    "user": "abcd",
    "password": "efgh",
    "host": "postgres.db",
    "database": "dev",
}

conn = psycopg2.connect(connection_factory=LoggingConnection, **db_settings)
conn.initialize(logger)

cur = conn.cursor()
cur.execute("SELECT * FROM table LIMIT 5")
k107
  • 15,882
  • 11
  • 61
  • 59
  • Hi, thank you for the example. I personally need the console output. For example, at the end of the sql statement the client prints this to STOUT: ``` [2019-07-15 15:59:51] 1 row retrieved starting from 1 in 2 s 318 ms (execution: 2 s 279 ms, fetching: 39 ms) ``` – Jonathan Jul 15 '19 at 23:47
6

If you want to use LoggingConnection directly, you need to provide the DSN as a libpq connection string to LoggingConnection() - either a key/value connection string or a connection URI works:

from psycopg2.extras import LoggingConnection

DSN = "postgresql://john:secret@localhost/mydb"
#DSN = "host=localhost dbname=mydb user=john password=secret"

logfile = open('db.log', 'a')

conn = LoggingConnection(DSN)
conn.initialize(logfile)

cur = conn.cursor()
cur.execute('SELECT 1')

However, I would probably use a connection factory like @kristi demonstrated.

Lukas Graf
  • 30,317
  • 8
  • 77
  • 92