lots more pod
[p5sagit/Log-Contextual.git] / lib / Log / Contextual.pm
CommitLineData
0daa11f3 1package Log::Contextual;
2
a2777569 3use strict;
4use warnings;
2033c911 5
a2777569 6our $VERSION = '1.000';
2033c911 7
8require Exporter;
f11f9542 9use Data::Dumper::Concise;
2033c911 10
a2777569 11BEGIN { our @ISA = qw(Exporter) }
2033c911 12
f11f9542 13my @dlog = (qw{
14 Dlog_debug DlogS_debug
15 Dlog_trace DlogS_trace
16 Dlog_warn DlogS_warn
17 Dlog_info DlogS_info
18 Dlog_error DlogS_error
19 Dlog_fatal DlogS_fatal
20});
21
22my @log = (qw{
23 log_debug
24 log_trace
25 log_warn
26 log_info
27 log_error
28 log_fatal
29});
30
a2777569 31our @EXPORT_OK = (
f11f9542 32 @dlog, @log,
33 qw{set_logger with_logger}
34);
35
a2777569 36our %EXPORT_TAGS = (
f11f9542 37 dlog => \@dlog,
38 log => \@log,
39);
40
41sub import {
a2777569 42 my $package = shift;
f11f9542 43 die 'Log::Contextual does not have a default import list'
a2777569 44 unless @_;
45
46 for my $idx ( 0 .. $#_ ) {
47 if ( $_[$idx] eq '-logger' ) {
48 set_logger($_[$idx + 1]);
49 splice @_, $idx, 2;
50 last;
51 }
52 }
53 $package->export_to_level(1, $package, @_);
f11f9542 54}
2033c911 55
7cec609c 56our $Get_Logger;
57
8dc5a747 58sub set_logger {
59 my $logger = $_[0];
60 $logger = do { my $l = $logger; sub { $l } }
61 if ref $logger ne 'CODE';
62 $Get_Logger = $logger;
7cec609c 63}
64
98833ffb 65sub with_logger {
66 my $logger = $_[0];
67 $logger = do { my $l = $logger; sub { $l } }
68 if ref $logger ne 'CODE';
69 local $Get_Logger = $logger;
80c3e48b 70 $_[1]->();
2daff231 71}
72
6dc6632a 73sub log_trace (&) {
74 my $log = $Get_Logger->();
75 $log->trace($_[0]->())
76 if $log->is_trace;
77}
78
7cec609c 79sub log_debug (&) {
80 my $log = $Get_Logger->();
81 $log->debug($_[0]->())
82 if $log->is_debug;
83}
84
6dc6632a 85sub log_info (&) {
86 my $log = $Get_Logger->();
87 $log->info($_[0]->())
88 if $log->is_info;
89}
90
91sub log_warn (&) {
92 my $log = $Get_Logger->();
93 $log->warn($_[0]->())
94 if $log->is_warn;
95}
96
97sub log_error (&) {
98 my $log = $Get_Logger->();
99 $log->error($_[0]->())
100 if $log->is_error;
101}
102
103sub log_fatal (&) {
104 my $log = $Get_Logger->();
105 $log->fatal($_[0]->())
106 if $log->is_fatal;
107}
108
f11f9542 109
110
111sub Dlog_trace (&@) {
112 my $code = shift;
113 my @values = @_;
114 log_trace {
115 do { local $_ = Data::Dumper::Concise::Dumper @values; $code->() };
116 };
117 @values
118}
119
120sub DlogS_trace (&$) {
121 my $code = $_[0];
122 my $value = $_[1];
123 log_trace {
124 do { local $_ = Data::Dumper::Concise::Dumper $value; $code->() };
125 };
126 $value
127}
128
129sub Dlog_debug (&@) {
130 my $code = shift;
131 my @values = @_;
132 log_debug {
133 do { local $_ = Data::Dumper::Concise::Dumper @values; $code->() };
134 };
135 @values
136}
137
138sub DlogS_debug (&$) {
139 my $code = $_[0];
140 my $value = $_[1];
141 log_debug {
142 do { local $_ = Data::Dumper::Concise::Dumper $value; $code->() };
143 };
144 $value
145}
146
147sub Dlog_info (&@) {
148 my $code = shift;
149 my @values = @_;
150 log_info {
151 do { local $_ = Data::Dumper::Concise::Dumper @values; $code->() };
152 };
153 @values
154}
155
156sub DlogS_info (&$) {
157 my $code = $_[0];
158 my $value = $_[1];
159 log_info {
160 do { local $_ = Data::Dumper::Concise::Dumper $value; $code->() };
161 };
162 $value
163}
164
165sub Dlog_warn (&@) {
166 my $code = shift;
167 my @values = @_;
168 log_warn {
169 do { local $_ = Data::Dumper::Concise::Dumper @values; $code->() };
170 };
171 @values
172}
173
174sub DlogS_warn (&$) {
175 my $code = $_[0];
176 my $value = $_[1];
177 log_warn {
178 do { local $_ = Data::Dumper::Concise::Dumper $value; $code->() };
179 };
180 $value
181}
182
183sub Dlog_error (&@) {
184 my $code = shift;
185 my @values = @_;
186 log_error {
187 do { local $_ = Data::Dumper::Concise::Dumper @values; $code->() };
188 };
189 @values
190}
191
192sub DlogS_error (&$) {
193 my $code = $_[0];
194 my $value = $_[1];
195 log_error {
196 do { local $_ = Data::Dumper::Concise::Dumper $value; $code->() };
197 };
198 $value
199}
200
201sub Dlog_fatal (&@) {
202 my $code = shift;
203 my @values = @_;
204 log_fatal {
205 do { local $_ = Data::Dumper::Concise::Dumper @values; $code->() };
206 };
207 @values
208}
209
210sub DlogS_fatal (&$) {
211 my $code = $_[0];
212 my $value = $_[1];
213 log_fatal {
214 do { local $_ = Data::Dumper::Concise::Dumper $value; $code->() };
215 };
216 $value
217}
218
0daa11f3 2191;
0a3750e2 220
221__END__
222
2daff231 223=head1 NAME
224
225Log::Contextual - Super simple logging interface
226
227=head1 SYNOPSIS
228
21431192 229 use Log::Contextual qw{:log set_logger with_logger};
2daff231 230
21431192 231 my $logger = Log::Contextual::SimpleLogger->new({ levels => [qw{debug}]});
2daff231 232
233 set_logger { $logger };
234
235 log_debug { "program started" };
236
237 sub foo {
21431192 238 with_logger Log::Contextual::SimpleLogger->new({
239 levels => [qw{trace debug}]
240 }) => sub {
241 log_trace { 'foo entered' };
2daff231 242 # ...
21431192 243 log_trace { 'foo left' };
244 };
2daff231 245 }
246
247=head1 DESCRIPTION
248
21431192 249This module is a simple interface to extensible logging.
2daff231 250
251=head1 FUNCTIONS
252
253=head2 set_logger
254
255 my $logger = WarnLogger->new;
21431192 256 set_logger $logger;
257
258Arguments: Ref|CodeRef $returning_logger
2daff231 259
21431192 260C<set_logger> will just set the current logger to whatever you pass it. It
261expects a C<CodeRef>, but if you pass it something else it will wrap it in a
262C<CodeRef> for you.
2daff231 263
264=head2 with_logger
265
266 my $logger = WarnLogger->new;
21431192 267 with_logger $logger => sub {
2daff231 268 if (1 == 0) {
269 log_fatal { 'Non Logical Universe Detected' };
270 } else {
271 log_info { 'All is good' };
272 }
80c3e48b 273 };
2daff231 274
21431192 275Arguments: Ref|CodeRef $returning_logger, CodeRef $to_execute
2daff231 276
21431192 277C<with_logger> sets the logger for the scope of the C<CodeRef> C<$to_execute>.
278as with L<set_logger>, C<with_logger> will wrap C<$returning_logger> with a
279C<CodeRef> if needed.
2daff231 280
21431192 281=head2 log_$level
2daff231 282
283Arguments: CodeRef $returning_message
284
21431192 285All of the following six functions work the same except that a different method
286is called on the underlying C<$logger> object. The basic pattern is:
2daff231 287
21431192 288 sub log_$level (&) {
289 if ($logger->is_$level) {
290 $logger->$level(shift->());
291 }
292 }
2daff231 293
21431192 294=head3 log_trace
2daff231 295
21431192 296 log_trace { 'entered method foo with args ' join q{,}, @args };
2daff231 297
21431192 298=head3 log_debug
2daff231 299
21431192 300 log_debug { 'entered method foo' };
2daff231 301
21431192 302=head3 log_info
2daff231 303
21431192 304 log_info { 'started process foo' };
2daff231 305
21431192 306=head3 log_warn
2daff231 307
21431192 308 log_warn { 'possible misconfiguration at line 10' };
2daff231 309
21431192 310=head3 log_error
2daff231 311
21431192 312 log_error { 'non-numeric user input!' };
2daff231 313
21431192 314=head3 log_fatal
2daff231 315
316 log_fatal { '1 is never equal to 0!' };
317
21431192 318=head2 Dlog_$level
319
2daff231 320Arguments: CodeRef $returning_message
321
21431192 322All of the following six functions work the same as their log_$level brethren,
323except they return what is passed into them and as a bonus put the stringified
324(with L<Data::Dumper::Concise>) version of their args into C<$_>. This means
325you can do cool things like the following:
326
327 my @nicks = Dlog_debug { "names: $_" } map $_->value, $frew->names->all;
328
329and the output might look something like:
330
331 names: "fREW"
332 "fRIOUX"
333 "fROOH"
334 "fRUE"
335 "fiSMBoC"
336
337=head3 Dlog_trace
338
339 my ($foo, $bar) = Dlog_trace { "entered method foo with args $_" } @_;
340
341=head3 Dlog_debug
342
343 Dlog_debug { "random data structure: $_" } { foo => $bar };
344
345=head3 Dlog_info
346
347 return Dlog_info { "html from method returned: $_" } "<html>...</html>";
348
349=head3 Dlog_warn
350
351 Dlog_warn { "probably invalid value: $_" } $foo;
352
353=head3 Dlog_error
354
355 Dlog_error { "non-numeric user input! ($_)" } $port;
2daff231 356
21431192 357=head3 Dlog_fatal
2daff231 358
21431192 359 Dlog_fatal { '1 is never equal to 0!' } 'ZOMG ZOMG' if 1 == 0;
2daff231 360
361=head1 AUTHOR
362
363frew - Arthur Axel "fREW" Schmidt <frioux@gmail.com>
364
365=head1 DESIGNER
366
367mst - Matt S. Trout <mst@shadowcat.co.uk>
368
369=head1 COPYRIGHT
370
371Copyright (c) 2010 the Log::Contextual L</AUTHOR> and L</DESIGNER> as listed
372above.
373
374=head1 LICENSE
375
376This library is free software and may be distributed under the same terms as
377Perl 5 itself.
378
379=cut
380