In Catalyst::Test, don't mangle headers of non-HTML responses. RT#79043
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Log.pm
CommitLineData
fc7ec1d9 1package Catalyst::Log;
2
e5ecd5bc 3use Moose;
531f1ab6 4with 'MooseX::Emulate::Class::Accessor::Fast';
5
f63c03e4 6use Data::Dump;
e106a59f 7use Class::MOP ();
0816209f 8use Carp qw/ cluck /;
9b2bc37b 9
c72d2e24 10our %LEVELS = (); # Levels stored as bit field, ergo debug = 1, warn = 2 etc
11our %LEVEL_MATCH = (); # Stored as additive, thus debug = 31, warn = 30 etc
a6433a05 12
3cdcf968 13has level => (is => 'rw');
5fb12dbb 14has _body => (is => 'rw');
3cdcf968 15has abort => (is => 'rw');
16
2f9e6321 17{
a6433a05 18 my @levels = qw[ debug info warn error fatal ];
846772b7 19
e106a59f 20 my $meta = Class::MOP::get_metaclass_by_name(__PACKAGE__);
c72d2e24 21 my $summed_level = 0;
22 for ( my $i = $#levels ; $i >= 0 ; $i-- ) {
846772b7 23
24 my $name = $levels[$i];
eaae9a92 25
846772b7 26 my $level = 1 << $i;
c72d2e24 27 $summed_level |= $level;
eaae9a92 28
a6433a05 29 $LEVELS{$name} = $level;
c72d2e24 30 $LEVEL_MATCH{$name} = $summed_level;
a6433a05 31
4090e3bb 32 $meta->add_method($name, sub {
846772b7 33 my $self = shift;
34
3cdcf968 35 if ( $self->level & $level ) {
846772b7 36 $self->_log( $name, @_ );
37 }
4090e3bb 38 });
846772b7 39
4090e3bb 40 $meta->add_method("is_$name", sub {
846772b7 41 my $self = shift;
3cdcf968 42 return $self->level & $level;
4090e3bb 43 });;
846772b7 44 }
a6433a05 45}
46
4090e3bb 47around new => sub {
48 my $orig = shift;
a6433a05 49 my $class = shift;
4090e3bb 50 my $self = $class->$orig;
e2422920 51
c72d2e24 52 $self->levels( scalar(@_) ? @_ : keys %LEVELS );
e2422920 53
a6433a05 54 return $self;
4090e3bb 55};
a6433a05 56
57sub levels {
58 my ( $self, @levels ) = @_;
59 $self->level(0);
60 $self->enable(@levels);
61}
62
63sub enable {
64 my ( $self, @levels ) = @_;
3cdcf968 65 my $level = $self->level;
c72d2e24 66 for(map { $LEVEL_MATCH{$_} } @levels){
3cdcf968 67 $level |= $_;
68 }
69 $self->level($level);
a6433a05 70}
846772b7 71
a6433a05 72sub disable {
73 my ( $self, @levels ) = @_;
3cdcf968 74 my $level = $self->level;
75 for(map { $LEVELS{$_} } @levels){
76 $level &= ~$_;
77 }
78 $self->level($level);
846772b7 79}
80
0816209f 81our $HAS_DUMPED;
a6433a05 82sub _dump {
846772b7 83 my $self = shift;
0816209f 84 unless ($HAS_DUMPED++) {
85 cluck("Catalyst::Log::_dump is deprecated and will be removed. Please change to using your own Dumper.\n");
86 }
f63c03e4 87 $self->info( Data::Dump::dump(@_) );
846772b7 88}
89
90sub _log {
91 my $self = shift;
92 my $level = shift;
846772b7 93 my $message = join( "\n", @_ );
1cf0345b 94 $message .= "\n" unless $message =~ /\n$/;
3cdcf968 95 my $body = $self->_body;
96 $body .= sprintf( "[%s] %s", $level, $message );
97 $self->_body($body);
4be535b1 98}
99
100sub _flush {
b5ecfcf0 101 my $self = shift;
3cdcf968 102 if ( $self->abort || !$self->_body ) {
b5ecfcf0 103 $self->abort(undef);
104 }
105 else {
3cdcf968 106 $self->_send_to_log( $self->_body );
4be535b1 107 }
3cdcf968 108 $self->_body(undef);
846772b7 109}
110
adee716c 111sub _send_to_log {
112 my $self = shift;
113 print STDERR @_;
114}
115
71415389 116# 5.7 compat code.
117# Alias _body to body, add a before modifier to warn..
118my $meta = __PACKAGE__->meta; # Calling meta method here fine as we happen at compile time.
119$meta->add_method('body', $meta->get_method('_body'));
eaae9a92 120my %package_hash; # Only warn once per method, per package.
71415389 121 # I haven't provided a way to disable them, patches welcome.
122$meta->add_before_method_modifier('body', sub {
123 my $class = blessed(shift);
124 $package_hash{$class}++ || do {
125 warn("Class $class is calling the deprecated method Catalyst::Log->body method,\n"
126 . "this will be removed in Catalyst 5.81");
127 };
128});
129# End 5.70 backwards compatibility hacks.
130
6680c772 131no Moose;
d14f9123 132__PACKAGE__->meta->make_immutable(inline_constructor => 0);
6680c772 133
846772b7 1341;
135
136__END__
fc7ec1d9 137
138=head1 NAME
139
140Catalyst::Log - Catalyst Log Class
141
142=head1 SYNOPSIS
143
82d2fcbe 144 $log = $c->log;
846772b7 145 $log->debug($message);
146 $log->info($message);
147 $log->warn($message);
148 $log->error($message);
149 $log->fatal($message);
846772b7 150
f4dbb0d9 151 if ( $log->is_debug ) {
846772b7 152 # expensive debugging
153 }
82d2fcbe 154
a6433a05 155
fc7ec1d9 156See L<Catalyst>.
157
158=head1 DESCRIPTION
159
adee716c 160This module provides the default, simple logging functionality for Catalyst.
161If you want something different set C<< $c->log >> in your application module,
162e.g.:
82d2fcbe 163
164 $c->log( MyLogger->new );
165
166Your logging object is expected to provide the interface described here.
397be447 167Good alternatives to consider are Log::Log4Perl and Log::Dispatch.
168
169If you want to be able to log arbitrary warnings, you can do something along
170the lines of
171
172 $SIG{__WARN__} = sub { MyApp->log->warn(@_); };
173
174however this is (a) global, (b) hairy and (c) may have unexpected side effects.
175Don't say we didn't warn you.
82d2fcbe 176
a6433a05 177=head1 LOG LEVELS
178
b5ecfcf0 179=head2 debug
a6433a05 180
181 $log->is_debug;
182 $log->debug($message);
183
b5ecfcf0 184=head2 info
a6433a05 185
186 $log->is_info;
187 $log->info($message);
188
b5ecfcf0 189=head2 warn
a6433a05 190
191 $log->is_warn;
192 $log->warn($message);
193
b5ecfcf0 194=head2 error
a6433a05 195
196 $log->is_error;
197 $log->error($message);
198
b5ecfcf0 199=head2 fatal
a6433a05 200
201 $log->is_fatal;
202 $log->fatal($message);
203
b22c6668 204=head1 METHODS
fc7ec1d9 205
b5ecfcf0 206=head2 new
a6433a05 207
26e73131 208Constructor. Defaults to enable all levels unless levels are provided in
a6433a05 209arguments.
210
211 $log = Catalyst::Log->new;
26e73131 212 $log = Catalyst::Log->new( 'warn', 'error' );
a6433a05 213
3cdcf968 214=head2 level
215
216Contains a bitmask of the currently set log levels.
217
b5ecfcf0 218=head2 levels
a6433a05 219
220Set log levels
b22c6668 221
a6433a05 222 $log->levels( 'warn', 'error', 'fatal' );
fc7ec1d9 223
b5ecfcf0 224=head2 enable
fc7ec1d9 225
a6433a05 226Enable log levels
fc7ec1d9 227
a6433a05 228 $log->enable( 'warn', 'error' );
fc7ec1d9 229
b5ecfcf0 230=head2 disable
fc7ec1d9 231
a6433a05 232Disable log levels
fc7ec1d9 233
a6433a05 234 $log->disable( 'warn', 'error' );
fc7ec1d9 235
b5ecfcf0 236=head2 is_debug
a2f2cde9 237
b5ecfcf0 238=head2 is_error
a2f2cde9 239
b5ecfcf0 240=head2 is_fatal
a2f2cde9 241
b5ecfcf0 242=head2 is_info
a2f2cde9 243
b5ecfcf0 244=head2 is_warn
49ba64d7 245
246Is the log level active?
247
b5ecfcf0 248=head2 abort
4be535b1 249
eaae9a92 250Should Catalyst emit logs for this request? Will be reset at the end of
251each request.
4be535b1 252
253*NOTE* This method is not compatible with other log apis, so if you plan
254to use Log4Perl or another logger, you should call it like this:
255
256 $c->log->abort(1) if $c->log->can('abort');
257
adee716c 258=head2 _send_to_log
259
260 $log->_send_to_log( @messages );
261
262This protected method is what actually sends the log information to STDERR.
263You may subclass this module and override this method to get finer control
264over the log output.
265
3cdcf968 266=head2 meta
267
fc7ec1d9 268=head1 SEE ALSO
269
270L<Catalyst>.
271
2f381252 272=head1 AUTHORS
fc7ec1d9 273
2f381252 274Catalyst Contributors, see Catalyst.pm
fc7ec1d9 275
276=head1 COPYRIGHT
277
536bee89 278This library is free software. You can redistribute it and/or modify
61b1e958 279it under the same terms as Perl itself.
fc7ec1d9 280
281=cut
282
e5ecd5bc 283__PACKAGE__->meta->make_immutable;
284
fc7ec1d9 2851;