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