PG:Connection::GeneralLog

Build Status

A monkey patch for pg. Stock all general logs.

Inspired by mysql2-client-general_log

#! /usr/bin/env ruby

require "pg/connection/general_log"

PG::Connection::GeneralLog.prepend_module

client = PG::Connection.new(config)
client.query("SELECT * FROM users LIMIT 1")

p PG::Connection::GeneralLog.general_log #=>
# [
#   #<struct PG::Connection::GeneralLog::Log
#     sql="SELECT * FROM users LIMIT 1",
#     args=[],
#     backtrace=["script.rb:6:in `<main>'"],
#     time=0.0909838349907659>
# ]

Examples

sinatra

config.ru:

require_relative './test'

require 'pg/connection/general_log'

use PG::Connection::GeneralLog::Middleware, enabled: true, backtrace: true, path: '/tmp/general_log'
run Sinatra::Application

test.rb:

require 'sinatra'
require 'pg'

helpers do
  def db
    Thread.current[:db] ||= PG::Connection.new(config)
  end
end

get '/' do
  db.exec("SELECT * FROM users WHERE name = 'hoge'")
  db.exec_params('SELECT * FROM users WHERE name = $1', ['hoge'])

  db.prepare('select', 'SELECT * FROM users WHERE name = $1')
  db.exec_prepared('select', ['bar'])
  db.exec_prepared('select', ['foo'])
end

/tmp/general_log/2017-11-19.txt:

REQUEST GET	/	4
SQL	(0000.89ms)	SELECT * FROM users WHERE name = 'hoge'	[]	/path/to/test.rb:12:in `block in <main>'
SQL	(0000.78ms)	SELECT * FROM users WHERE name = $1	["hoge"]	/path/to/test.rb:13:in `block in <main>'
SQL	(0000.66ms)	SELECT * FROM users WHERE name = $1	["barr"]	/path/to/test.rb:16:in `block in <main>'
SQL	(0000.65ms)	SELECT * FROM users WHERE name = $1	["foo"]	/path/to/test.rb:17:in `block in <main>'

Installation

Add this line to your application's Gemfile:

gem 'pg-connection-general_log'

And then execute:

$ bundle

Test

$ bundle exec rake

Example server

$ bundle exec rake example

License

The gem is available as open source under the terms of the MIT License.