Cleaned up Tut files; no substantive changes
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Log.pm
CommitLineData
fc7ec1d9 1package Catalyst::Log;
2
3use strict;
4use base 'Class::Accessor::Fast';
f63c03e4 5use Data::Dump;
9b2bc37b 6
a6433a05 7our %LEVELS = ();
8
9__PACKAGE__->mk_accessors('level');
4be535b1 10__PACKAGE__->mk_accessors('body');
11__PACKAGE__->mk_accessors('abort');
846772b7 12
2f9e6321 13{
a6433a05 14 my @levels = qw[ debug info warn error fatal ];
846772b7 15
16 for ( my $i = 0 ; $i < @levels ; $i++ ) {
17
18 my $name = $levels[$i];
19 my $level = 1 << $i;
20
a6433a05 21 $LEVELS{$name} = $level;
22
23 no strict 'refs';
24
846772b7 25 *{$name} = sub {
26 my $self = shift;
27
28 if ( $self->{level} & $level ) {
29 $self->_log( $name, @_ );
30 }
31 };
32
33 *{"is_$name"} = sub {
34 my $self = shift;
846772b7 35 return $self->{level} & $level;
36 };
37 }
a6433a05 38}
39
40sub new {
41 my $class = shift;
42 my $self = $class->SUPER::new;
43 $self->levels( scalar(@_) ? @_ : keys %LEVELS );
44 return $self;
45}
46
47sub levels {
48 my ( $self, @levels ) = @_;
49 $self->level(0);
50 $self->enable(@levels);
51}
52
53sub enable {
54 my ( $self, @levels ) = @_;
55 $self->{level} |= $_ for map { $LEVELS{$_} } @levels;
56}
846772b7 57
a6433a05 58sub disable {
59 my ( $self, @levels ) = @_;
60 $self->{level} &= ~$_ for map { $LEVELS{$_} } @levels;
846772b7 61}
62
a6433a05 63sub _dump {
846772b7 64 my $self = shift;
f63c03e4 65 $self->info( Data::Dump::dump(@_) );
846772b7 66}
67
68sub _log {
69 my $self = shift;
70 my $level = shift;
846772b7 71 my $message = join( "\n", @_ );
34d28dfd 72 $self->{body} .= sprintf( "[%s] %s\n", $level, $message );
4be535b1 73}
74
75sub _flush {
b5ecfcf0 76 my $self = shift;
77 if ( $self->abort || !$self->body ) {
78 $self->abort(undef);
79 }
80 else {
adee716c 81 $self->_send_to_log( $self->body );
4be535b1 82 }
83 $self->body(undef);
846772b7 84}
85
adee716c 86sub _send_to_log {
87 my $self = shift;
88 print STDERR @_;
89}
90
846772b7 911;
92
93__END__
fc7ec1d9 94
95=head1 NAME
96
97Catalyst::Log - Catalyst Log Class
98
99=head1 SYNOPSIS
100
82d2fcbe 101 $log = $c->log;
846772b7 102 $log->debug($message);
103 $log->info($message);
104 $log->warn($message);
105 $log->error($message);
106 $log->fatal($message);
846772b7 107
f4dbb0d9 108 if ( $log->is_debug ) {
846772b7 109 # expensive debugging
110 }
82d2fcbe 111
a6433a05 112
fc7ec1d9 113See L<Catalyst>.
114
115=head1 DESCRIPTION
116
adee716c 117This module provides the default, simple logging functionality for Catalyst.
118If you want something different set C<< $c->log >> in your application module,
119e.g.:
82d2fcbe 120
121 $c->log( MyLogger->new );
122
123Your logging object is expected to provide the interface described here.
124
a6433a05 125=head1 LOG LEVELS
126
b5ecfcf0 127=head2 debug
a6433a05 128
129 $log->is_debug;
130 $log->debug($message);
131
b5ecfcf0 132=head2 info
a6433a05 133
134 $log->is_info;
135 $log->info($message);
136
b5ecfcf0 137=head2 warn
a6433a05 138
139 $log->is_warn;
140 $log->warn($message);
141
b5ecfcf0 142=head2 error
a6433a05 143
144 $log->is_error;
145 $log->error($message);
146
b5ecfcf0 147=head2 fatal
a6433a05 148
149 $log->is_fatal;
150 $log->fatal($message);
151
b22c6668 152=head1 METHODS
fc7ec1d9 153
b5ecfcf0 154=head2 new
a6433a05 155
26e73131 156Constructor. Defaults to enable all levels unless levels are provided in
a6433a05 157arguments.
158
159 $log = Catalyst::Log->new;
26e73131 160 $log = Catalyst::Log->new( 'warn', 'error' );
a6433a05 161
b5ecfcf0 162=head2 levels
a6433a05 163
164Set log levels
b22c6668 165
a6433a05 166 $log->levels( 'warn', 'error', 'fatal' );
fc7ec1d9 167
b5ecfcf0 168=head2 enable
fc7ec1d9 169
a6433a05 170Enable log levels
fc7ec1d9 171
a6433a05 172 $log->enable( 'warn', 'error' );
fc7ec1d9 173
b5ecfcf0 174=head2 disable
fc7ec1d9 175
a6433a05 176Disable log levels
fc7ec1d9 177
a6433a05 178 $log->disable( 'warn', 'error' );
fc7ec1d9 179
b5ecfcf0 180=head2 is_debug
a2f2cde9 181
b5ecfcf0 182=head2 is_error
a2f2cde9 183
b5ecfcf0 184=head2 is_fatal
a2f2cde9 185
b5ecfcf0 186=head2 is_info
a2f2cde9 187
b5ecfcf0 188=head2 is_warn
49ba64d7 189
190Is the log level active?
191
b5ecfcf0 192=head2 abort
4be535b1 193
194Should Catalyst emit logs for this request? Will be reset at the end of
195each request.
196
197*NOTE* This method is not compatible with other log apis, so if you plan
198to use Log4Perl or another logger, you should call it like this:
199
200 $c->log->abort(1) if $c->log->can('abort');
201
adee716c 202=head2 _send_to_log
203
204 $log->_send_to_log( @messages );
205
206This protected method is what actually sends the log information to STDERR.
207You may subclass this module and override this method to get finer control
208over the log output.
209
fc7ec1d9 210=head1 SEE ALSO
211
212L<Catalyst>.
213
214=head1 AUTHOR
215
216Sebastian Riedel, C<sri@cpan.org>
61b1e958 217Marcus Ramberg, C<mramberg@cpan.org>
a6433a05 218Christian Hansen, C<ch@ngmedia.com>
fc7ec1d9 219
220=head1 COPYRIGHT
221
a6433a05 222This program is free software, you can redistribute it and/or modify
61b1e958 223it under the same terms as Perl itself.
fc7ec1d9 224
225=cut
226
2271;