NAME
DBIx::QueryLog - Logging queries for DBI
SYNOPSIS
use
DBIx::QueryLog;
my
$row
=
$dbh
->selectrow_hashref(
'SELECT * FROM people WHERE user_id = ?'
,
undef
,
qw/1986/
);
# => SELECT * FROM people WHERE user_id = '1986';
DESCRIPTION
DBIx::QueryLog logs each execution time and the actual query.
Currently, it works with DBD::mysql, DBD::Pg and DBD::SQLite.
CLASS METHODS
- threshold
-
If set, only queries that take more time than this threshold will be logged (default is undef)
DBIx::QueryLog->threshold(0.1);
# sec
You can also specify this with
DBIX_QUERYLOG_THRESHOLD
environment variable. - probability
-
If set, the logger logs only once per a defined value. (default is undef)
DBIx::QueryLog->probability(100);
# about 1/100
You can also specify this with
DBIX_QUERYLOG_PROBABILITY
environment variable. - logger
-
Sets a logger class (e.g. Log::Dispach)
The logger class must have a `log` method, which should work like the one of Log::Dispatch (but see also OUTPUT section below).
DBIx::QueryLog->logger(
$logger
);
- skip_bind
-
If set, DBIx::QueryLog runs faster, but placeholders are not processed.
DBIx::QueryLog->skip_bind(1);
my
$row
=
$dbh
->
do
(...);
# => 'SELECT * FROM people WHERE user_id = ?' : [1986]
You can also specify this with
DBIX_QUERYLOG_SKIP_BIND
environment variable. - color
-
If set, log messages will be colored with Term::ANSIColor.
DBIx::QueryLog->color(
'green'
);
You can also specify this with
DBIX_QUERYLOG_COLOR
environment variable. - useqq
-
If set, DBIx::QueryLog uses
$Data::Dumper::Useqq
.DBIx::QueryLog->useqq(1);
You can also specify this with
DBIX_QUERYLOG_USEQQ
environment variable. - compact
-
If set, log messages will be compact.
DBIx::QueryLog->compact(1);
# FROM: SELECT * FROM foo WHERE bar = 'baz'
# TO : SELECT * FROM foo WHERE bar = 'baz'
You can also specify this with
DBIX_QUERYLOG_COMPACT
environment variable. - explain
-
EXPERIMENTAL
If set, DBIx::QueryLog logs the result of a
EXPLAIN
statement.DBIx::QueryLog->explain(1);
my
$row
=
$dbh
->
do
(...);
# => SELECT * FROM peaple WHERE user_id = '1986'
# .----------------------------------------------------------------------------------------------.
# | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
# +----+-------------+--------+-------+---------------+---------+---------+-------+------+-------+
# | 1 | SIMPLE | peaple | const | PRIMARY | PRIMARY | 4 | const | 1 | |
# '----+-------------+--------+-------+---------------+---------+---------+-------+------+-------'
You can also specify this with
DBIX_QUERYLOG_EXPLAIN
environment variable. - show_data_source
-
if set, DBI data_source will be added to the log messages.
$dbh
->
do
(
'SELECT * FROM sqlite_master'
);
# [2012-03-09T00:58:23] [main] [0.000953] SELECT * FROM sqlite_master at foo.pl line 34
DBIx::QueryLog->show_data_source(1);
$dbh
->
do
(
'SELECT * FROM sqlite_master'
);
# [2012-03-09T00:58:23] [main] [0.000953] [SQLite:dbname=/tmp/TrSATdY3cc] SELECT * FROM sqlite_master at foo.pl line 56
You can also specify this with
DBIX_QUERYLOG_SHOW_DATASOURCE
environment variable. - guard
-
Returns a guard object.
The following code does the same:
- ignore_trace
-
Returns a guard object and disables tracing while the object is alive.
use
DBIx::QueryLog;
# enabled
$dbh
->
do
(...);
{
my
$guard
= DBIx::QueryLog->ignore_trace;
# disable
$dbh
->
do
(...);
}
# enabled
$dbh
->
do
(...)
- is_enabled
-
Returns if DBIx::QueryLog is enabled or not.
See also Localization section.
TIPS
Localization
If you want to log only in a specific scope:
DBIx::QueryLog->begin;
# or DBIx::QueryLog->enable
my
$row
=
$dbh
->
do
(...);
DBIx::QueryLog->end;
# or DBIx::QueryLog->disable
DBIx::QueryLog logs only between begin
and end
.
LOG_LEVEL
When you set a logger
, you might also want to change a log level.
$DBIx::QueryLog::LOG_LEVEL
=
'info'
;
# default 'debug'
OUTPUT
If you want to change where to output:
open
my
$fh
,
'>'
,
'dbix_query.log'
;
$DBIx::QueryLog::OUTPUT
=
$fh
;
You can also specify a code reference:
$DBIx::QueryLog::OUTPUT
=
sub
{
my
%params
=
@_
;
my
$format
= <<
'FORMAT'
;
localtime
:
%s
# ISO-8601 without timezone
level :
%s
# log level ($DBIx::QueryLog::LOG_LEVEL)
time
:
%f
# elasped time
data_source:
$s
# data_source
sql :
%s
# executed query
bind_params:
%s
# bind parameters
pkg :
%s
# caller package
file :
%s
# caller file
line :
%d
# caller line
FORMAT
printf
$format
,
@params
{
qw/localtime level pkg time data_source sql/
},
join
(
', '
, @{
$params
{bind_params}}),
@params
{
qw/file line/
};
printf
"AutoCommit?: %d\n"
,
$params
->{dbh}->{AutoCommit} ? 1 : 0;
};
You can also use this if you want to use a logger that doesn't have a log
method like the one of <Log::Dispatch>.
$DBIx::QueryLog::OUTPUT
=
sub
{
my
%params
=
@_
;
my
$logger
= Log::Any->get_logger;
$logger
->debug(
"$params{message}"
);
};
Note that this only works when <logger
> is not set.
Default $OUTPUT
is STDERR
.
AUTHOR
xaicron <xaicron {at} cpan.org>
THANKS TO
tokuhirom
yibe
kamipo
tomi-ru
riywo
makamaka
BUG REPORTING
Plese use github issues: https://github.com/xaicron/p5-DBIx-QueryLog/issues.
COPYRIGHT
Copyright 2010 - xaicron
LICENSE
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.