Go SQL driver adapter for logging queries and other SQL operations
- Any
driver.Connector
can be wrapped withsqllogger.LoggingConnector(SQLLogger, driver.Connector)
to log Connect, Prepare, Exec, Query, Commit, Rollback and Close on database, connection, statement, rows and transaction instances (see ./sql_logger.go for all intercepted calls) - The
sqllogger.SQLLogger
interface can be implemented to log SQL to any logging library sqllogger.NewDefaultSQLLogger(StdLogger)
offers a default implementation for the standard librarylog.Logger
or implementations of theStdLogger
interface- Zero dependencies
Note: The adapter has been tested using
github.com/lib/pq
. Other SQL drivers might need additional work. As thedatabase/sql/driver
package offers a lot of optional interfaces, not every advanced feature might work as expected when using the logging connector as an adapter to the original driver.
This needs a running PostgreSQL database.
See ./example/main.go:
package main
import (
"context"
"database/sql"
"fmt"
"log"
"os"
"github.com/lib/pq"
"github.com/networkteam/go-sqllogger"
)
func main() {
logger := log.New(os.Stderr, "SQL: ", 0)
sqlLogger := sqllogger.NewDefaultSQLLogger(logger)
sqlLogger.LogClose = true
pqConnector, err := pq.NewConnector("dbname=test sslmode=disable")
if err != nil {
failf("could not connect to database: %v", err)
}
connector := sqllogger.LoggingConnector(sqlLogger, pqConnector)
db := sql.OpenDB(connector)
ctx := context.Background()
rows, err := db.QueryContext(ctx, "SELECT 42")
if err != nil {
failf("could not query database: %v", err)
}
defer rows.Close()
if rows.Next() {
var answer int
if err := rows.Scan(&answer); err != nil {
failf("could not scan row: %v", err)
}
fmt.Printf("The answer is: %d\n", answer)
}
}
func failf(format string, args ...interface{}) {
fmt.Printf(format+"\n", args...)
os.Exit(1)
}
Running the example:
> createdb test # If it does not exist
> go run github.com/networkteam/go-sqllogger/example
SQL: Connect → CONN(1)
SQL: CONN(1) ► Query(SELECT 42) → ROWS(2)
The answer is: 42
SQL: ROWS(2) ► Close