| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package DBIx::Class::UnicornLogger; |
|
2
|
|
|
|
|
|
|
$DBIx::Class::UnicornLogger::VERSION = '0.001004'; |
|
3
|
|
|
|
|
|
|
# ABSTRACT: Pretty Printing DebugObj with nicer logging features |
|
4
|
|
|
|
|
|
|
|
|
5
|
5
|
|
|
5
|
|
80745
|
use Moo; |
|
|
5
|
|
|
|
|
57848
|
|
|
|
5
|
|
|
|
|
29
|
|
|
6
|
|
|
|
|
|
|
extends 'DBIx::Class::Storage::Statistics'; |
|
7
|
|
|
|
|
|
|
|
|
8
|
5
|
|
|
5
|
|
10164
|
use SQL::Abstract::Tree; |
|
|
5
|
|
|
|
|
172055
|
|
|
|
5
|
|
|
|
|
323
|
|
|
9
|
5
|
|
|
5
|
|
11926
|
use Log::Structured; |
|
|
5
|
|
|
|
|
39171
|
|
|
|
5
|
|
|
|
|
271
|
|
|
10
|
5
|
|
|
5
|
|
3470
|
use Log::Sprintf; |
|
|
5
|
|
|
|
|
207704
|
|
|
|
5
|
|
|
|
|
6479
|
|
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
my %code_to_method = ( |
|
13
|
|
|
|
|
|
|
C => 'log_package', |
|
14
|
|
|
|
|
|
|
c => 'log_category', |
|
15
|
|
|
|
|
|
|
d => 'log_date', |
|
16
|
|
|
|
|
|
|
F => 'log_file', |
|
17
|
|
|
|
|
|
|
H => 'log_host', |
|
18
|
|
|
|
|
|
|
L => 'log_line', |
|
19
|
|
|
|
|
|
|
l => 'log_location', |
|
20
|
|
|
|
|
|
|
M => 'log_subroutine', |
|
21
|
|
|
|
|
|
|
P => 'log_pid', |
|
22
|
|
|
|
|
|
|
p => 'log_priority', |
|
23
|
|
|
|
|
|
|
r => 'log_milliseconds_since_start', |
|
24
|
|
|
|
|
|
|
R => 'log_milliseconds_since_last_log', |
|
25
|
|
|
|
|
|
|
T => 'log_stacktrace', |
|
26
|
|
|
|
|
|
|
); |
|
27
|
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
sub BUILDARGS { |
|
29
|
8
|
|
|
8
|
0
|
14169
|
my ($self, @rest) = @_; |
|
30
|
|
|
|
|
|
|
|
|
31
|
8
|
|
|
|
|
37
|
my %args = ( |
|
32
|
|
|
|
|
|
|
@rest == 1 |
|
33
|
8
|
50
|
|
|
|
35
|
? %{$rest[0]} |
|
34
|
|
|
|
|
|
|
: @rest |
|
35
|
|
|
|
|
|
|
); |
|
36
|
|
|
|
|
|
|
|
|
37
|
8
|
|
100
|
|
|
138
|
$args{_sqlat} = SQL::Abstract::Tree->new($args{tree} || {}); |
|
38
|
|
|
|
|
|
|
|
|
39
|
8
|
|
|
|
|
9837
|
return \%args |
|
40
|
|
|
|
|
|
|
} |
|
41
|
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
has _sqlat => ( |
|
43
|
|
|
|
|
|
|
is => 'ro', |
|
44
|
|
|
|
|
|
|
); |
|
45
|
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
has _clear_line_str => ( |
|
47
|
|
|
|
|
|
|
is => 'ro', |
|
48
|
|
|
|
|
|
|
init_arg => 'clear_line', |
|
49
|
|
|
|
|
|
|
); |
|
50
|
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
has _executing_str => ( |
|
52
|
|
|
|
|
|
|
is => 'ro', |
|
53
|
|
|
|
|
|
|
init_arg => 'executing', |
|
54
|
|
|
|
|
|
|
); |
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
has _show_progress => ( |
|
57
|
|
|
|
|
|
|
is => 'ro', |
|
58
|
|
|
|
|
|
|
init_arg => 'show_progress', |
|
59
|
|
|
|
|
|
|
); |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
has _last_sql => ( |
|
62
|
|
|
|
|
|
|
is => 'rw', |
|
63
|
|
|
|
|
|
|
default => sub { '' }, |
|
64
|
|
|
|
|
|
|
init_arg => undef, |
|
65
|
|
|
|
|
|
|
); |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
has _squash_repeats => ( |
|
68
|
|
|
|
|
|
|
is => 'ro', |
|
69
|
|
|
|
|
|
|
init_arg => 'squash_repeats', |
|
70
|
|
|
|
|
|
|
); |
|
71
|
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
has _structured_logger => ( |
|
73
|
|
|
|
|
|
|
is => 'rw', |
|
74
|
|
|
|
|
|
|
lazy => 1, |
|
75
|
|
|
|
|
|
|
builder => '_build_structured_logger', |
|
76
|
|
|
|
|
|
|
); |
|
77
|
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
sub _build_structured_logger { |
|
79
|
6
|
|
|
6
|
|
1620
|
my $self = shift; |
|
80
|
|
|
|
|
|
|
|
|
81
|
6
|
100
|
66
|
|
|
58
|
if ($self->_format || $self->_multiline_format) { |
|
82
|
3
|
|
50
|
|
|
7
|
my $format = $self->_format || '%m'; |
|
83
|
|
|
|
|
|
|
|
|
84
|
3
|
|
|
|
|
24
|
my $log_sprintf = Log::Sprintf->new({ format => $format }); |
|
85
|
|
|
|
|
|
|
|
|
86
|
3
|
100
|
|
|
|
26
|
my $per_line_log_sprintf = Log::Sprintf->new({ |
|
87
|
|
|
|
|
|
|
format => $self->_multiline_format |
|
88
|
|
|
|
|
|
|
}) if $self->_multiline_format; |
|
89
|
|
|
|
|
|
|
|
|
90
|
3
|
|
|
|
|
7
|
my %formats = %{{ |
|
|
9
|
|
|
|
|
78
|
|
|
91
|
18
|
|
|
|
|
174
|
map { $_->{conversion} => 1 } |
|
92
|
5
|
|
|
|
|
307
|
grep { ref $_ } |
|
93
|
3
|
|
|
|
|
13
|
map @{$log_sprintf->_formatter->format_hunker->($log_sprintf, $_)}, |
|
94
|
|
|
|
|
|
|
grep $_, |
|
95
|
|
|
|
|
|
|
$log_sprintf->{format}, |
|
96
|
|
|
|
|
|
|
$per_line_log_sprintf->{format} |
|
97
|
|
|
|
|
|
|
}}; |
|
98
|
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
my $sub = $self->_multiline_format |
|
100
|
|
|
|
|
|
|
? sub { |
|
101
|
2
|
|
|
2
|
|
251
|
my %struc = %{$_[1]}; |
|
|
2
|
|
|
|
|
12
|
|
|
102
|
2
|
|
|
|
|
14
|
my (@msg, undef) = split /\n/, delete $struc{message}; |
|
103
|
2
|
|
|
|
|
15
|
$self->debugfh->print($log_sprintf->sprintf({ |
|
104
|
|
|
|
|
|
|
%struc, |
|
105
|
|
|
|
|
|
|
message => shift @msg, |
|
106
|
|
|
|
|
|
|
}) . "\n"); |
|
107
|
|
|
|
|
|
|
$self->debugfh->print($per_line_log_sprintf->sprintf({ |
|
108
|
|
|
|
|
|
|
%struc, |
|
109
|
|
|
|
|
|
|
message => $_, |
|
110
|
2
|
|
|
|
|
439
|
}) . "\n") for @msg; |
|
111
|
|
|
|
|
|
|
} |
|
112
|
|
|
|
|
|
|
: sub { |
|
113
|
1
|
|
|
1
|
|
93
|
my %struc = %{$_[1]}; |
|
|
1
|
|
|
|
|
6
|
|
|
114
|
1
|
|
|
|
|
5
|
my (@msg, undef) = split /\n/, delete $struc{message}; |
|
115
|
|
|
|
|
|
|
$self->debugfh->print($log_sprintf->sprintf({ |
|
116
|
|
|
|
|
|
|
%struc, |
|
117
|
|
|
|
|
|
|
message => $_, |
|
118
|
1
|
|
|
|
|
5
|
}) . "\n") for @msg; |
|
119
|
3
|
100
|
|
|
|
36
|
}; |
|
120
|
|
|
|
|
|
|
return |
|
121
|
3
|
|
|
|
|
73
|
Log::Structured->new({ |
|
122
|
|
|
|
|
|
|
category => 'DBIC', |
|
123
|
|
|
|
|
|
|
priority => 'TRACE', |
|
124
|
|
|
|
|
|
|
caller_depth => 2, |
|
125
|
|
|
|
|
|
|
log_event_listeners => [$sub], |
|
126
|
7
|
|
|
|
|
12
|
map { $code_to_method{$_} => 1 } |
|
127
|
3
|
|
|
|
|
10
|
grep { exists $code_to_method{$_} } |
|
128
|
|
|
|
|
|
|
keys %formats |
|
129
|
|
|
|
|
|
|
}) |
|
130
|
|
|
|
|
|
|
} |
|
131
|
|
|
|
|
|
|
} |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
has _format => ( |
|
134
|
|
|
|
|
|
|
is => 'ro', |
|
135
|
|
|
|
|
|
|
init_arg => 'format', |
|
136
|
|
|
|
|
|
|
); |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
has _multiline_format => ( |
|
139
|
|
|
|
|
|
|
is => 'ro', |
|
140
|
|
|
|
|
|
|
init_arg => 'multiline_format', |
|
141
|
|
|
|
|
|
|
); |
|
142
|
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
sub print { |
|
144
|
11
|
|
|
11
|
1
|
15
|
my $self = shift; |
|
145
|
11
|
|
|
|
|
15
|
my $string = shift; |
|
146
|
11
|
|
50
|
|
|
31
|
my $bindargs = shift || []; |
|
147
|
|
|
|
|
|
|
|
|
148
|
11
|
|
|
|
|
10
|
my ($lw, $lr); |
|
149
|
11
|
|
|
|
|
93
|
($lw, $string, $lr) = $string =~ /^(\s*)(.+?)(\s*)$/s; |
|
150
|
|
|
|
|
|
|
|
|
151
|
11
|
100
|
100
|
|
|
65
|
local $self->_sqlat->{fill_in_placeholders} = 0 if defined $bindargs->[0] |
|
152
|
|
|
|
|
|
|
&& $bindargs->[0] eq q('__BULK_INSERT__'); |
|
153
|
|
|
|
|
|
|
|
|
154
|
11
|
|
|
|
|
53
|
my $use_placeholders = !!$self->_sqlat->fill_in_placeholders; |
|
155
|
|
|
|
|
|
|
|
|
156
|
11
|
|
|
|
|
21
|
my $sqlat = $self->_sqlat; |
|
157
|
11
|
|
|
|
|
13
|
my $formatted; |
|
158
|
11
|
100
|
100
|
|
|
56
|
if ($self->_squash_repeats && $self->_last_sql eq $string) { |
|
159
|
3
|
|
|
|
|
3
|
my ( $l, $r ) = @{ $sqlat->placeholder_surround }; |
|
|
3
|
|
|
|
|
7
|
|
|
160
|
3
|
|
|
|
|
13
|
$formatted = '... : ' . join(', ', map "$l$_$r", @$bindargs) |
|
161
|
|
|
|
|
|
|
} else { |
|
162
|
8
|
|
|
|
|
25
|
$self->_last_sql($string); |
|
163
|
8
|
|
|
|
|
28
|
$formatted = $sqlat->format($string, $bindargs); |
|
164
|
8
|
100
|
|
|
|
6019
|
$formatted = "$formatted : " . join ', ', @{$bindargs} |
|
|
2
|
|
|
|
|
7
|
|
|
165
|
|
|
|
|
|
|
unless $use_placeholders; |
|
166
|
|
|
|
|
|
|
} |
|
167
|
|
|
|
|
|
|
|
|
168
|
11
|
100
|
|
|
|
167
|
if ($self->_structured_logger) { |
|
169
|
3
|
|
|
|
|
3706
|
$self->_structured_logger->log_event({ |
|
170
|
|
|
|
|
|
|
message => "$lw$formatted$lr", |
|
171
|
|
|
|
|
|
|
}) |
|
172
|
|
|
|
|
|
|
} else { |
|
173
|
8
|
|
|
|
|
101
|
$self->next::method("$lw$formatted$lr", @_) |
|
174
|
|
|
|
|
|
|
} |
|
175
|
|
|
|
|
|
|
} |
|
176
|
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
sub query_start { |
|
178
|
11
|
|
|
11
|
1
|
4687
|
my ($self, $string, @bind) = @_; |
|
179
|
|
|
|
|
|
|
|
|
180
|
11
|
50
|
|
|
|
58
|
if(defined $self->callback) { |
|
181
|
0
|
|
|
|
|
0
|
$string =~ m/^(\w+)/; |
|
182
|
0
|
|
|
|
|
0
|
$self->callback->($1, "$string: ".join(', ', @bind)."\n"); |
|
183
|
0
|
|
|
|
|
0
|
return; |
|
184
|
|
|
|
|
|
|
} |
|
185
|
|
|
|
|
|
|
|
|
186
|
11
|
|
|
|
|
49
|
$string =~ s/\s+$//; |
|
187
|
|
|
|
|
|
|
|
|
188
|
11
|
|
|
|
|
40
|
$self->print("$string\n", \@bind); |
|
189
|
|
|
|
|
|
|
|
|
190
|
11
|
100
|
|
|
|
1533
|
$self->debugfh->print($self->_executing_str) if $self->_show_progress |
|
191
|
|
|
|
|
|
|
} |
|
192
|
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
sub query_end { |
|
194
|
3
|
100
|
|
3
|
1
|
510
|
$_[0]->debugfh->print($_[0]->_clear_line_str) if $_[0]->_show_progress |
|
195
|
|
|
|
|
|
|
} |
|
196
|
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
1; |
|
198
|
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
__END__ |