File Coverage

blib/lib/Log/Log4perl/Logger.pm
Criterion Covered Total %
statement 394 410 96.1
branch 118 146 80.8
condition 23 31 74.1
subroutine 63 66 95.4
pod 0 41 0.0
total 598 694 86.1


line stmt bran cond sub pod time code
1             ##################################################
2             ##################################################
3              
4             use 5.006;
5 70     70   971 use strict;
  70         189  
6 70     70   285 use warnings;
  70         120  
  70         1155  
7 70     70   266  
  70         115  
  70         1533  
8             use Log::Log4perl;
9 70     70   304 use Log::Log4perl::Level;
  70         110  
  70         1577  
10 70     70   23126 use Log::Log4perl::Layout;
  70         137  
  70         234  
11 70     70   25502 use Log::Log4perl::Appender;
  70         165  
  70         1525  
12 70     70   25196 use Log::Log4perl::Appender::String;
  70         162  
  70         1768  
13 70     70   32123 use Log::Log4perl::Filter;
  70         152  
  70         1817  
14 70     70   23449 use Carp;
  70         578  
  70         2179  
15 70     70   370  
  70         118  
  70         4602  
16             $Carp::Internal{"Log::Log4perl"}++;
17             $Carp::Internal{"Log::Log4perl::Logger"}++;
18              
19             use constant _INTERNAL_DEBUG => 0;
20 70     70   4085  
  70         223  
  70         188871  
21             # Initialization
22             our $ROOT_LOGGER;
23             our $LOGGERS_BY_NAME = {};
24             our %APPENDER_BY_NAME = ();
25             our $INITIALIZED = 0;
26             our $NON_INIT_WARNED;
27             our $DIE_DEBUG = 0;
28             our $DIE_DEBUG_BUFFER = "";
29             # Define the default appender that's used for formatting
30             # warn/die/croak etc. messages.
31             our $STRING_APP_NAME = "_l4p_warn";
32             our $STRING_APP = Log::Log4perl::Appender->new(
33             "Log::Log4perl::Appender::String",
34             name => $STRING_APP_NAME);
35             $STRING_APP->layout(Log::Log4perl::Layout::PatternLayout->new("%m"));
36             our $STRING_APP_CODEREF = generate_coderef([[$STRING_APP_NAME, $STRING_APP]]);
37              
38             __PACKAGE__->reset();
39              
40             ###########################################
41             ###########################################
42             my($logger, @message) = @_;
43              
44 50     50 0 94 $STRING_APP->string("");
45             $STRING_APP_CODEREF->($logger,
46 50         250 @message,
47 50         121 Log::Log4perl::Level::to_level($ALL));
48             return $STRING_APP->string();
49             }
50 50         196  
51             ##################################################
52             ##################################################
53             # warn "Logger cleanup";
54              
55             # Nuke all convenience loggers to avoid them causing cleanup to
56             # be delayed until global destruction. Problem is that something like
57             # *{"DEBUG"} = sub { $logger->debug };
58             # ties up a reference to $logger until global destruction, so we
59             # need to clean up all :easy shortcuts, hence freeing the last
60             # logger references, to then rely on the garbage collector for cleaning
61             # up the loggers.
62             Log::Log4perl->easy_closure_global_cleanup();
63              
64             # Delete all loggers
65 72     72 0 587 $LOGGERS_BY_NAME = {};
66              
67             # Delete the root logger
68 72         316 undef $ROOT_LOGGER;
69              
70             # Delete all appenders
71 72         247 %APPENDER_BY_NAME = ();
72              
73             undef $INITIALIZED;
74 72         316 }
75              
76 72         1784 ##################################################
77             ##################################################
78             CORE::warn "Destroying logger $_[0] ($_[0]->{category})"
79             if $Log::Log4perl::CHATTY_DESTROY_METHODS;
80             }
81              
82 155 50   155   2278 ##################################################
83             ##################################################
84             $ROOT_LOGGER = __PACKAGE__->_new("", $OFF);
85             # $LOGGERS_BY_NAME = {}; #leave this alone, it's used by
86             #reset_all_output_methods when
87             #the config changes
88              
89 295     295 0 794 %APPENDER_BY_NAME = ();
90             undef $INITIALIZED;
91             undef $NON_INIT_WARNED;
92             Log::Log4perl::Appender::reset();
93              
94 295         634 #clear out all the existing appenders
95 295         495 foreach my $logger (values %$LOGGERS_BY_NAME){
96 295         424 $logger->{appender_names} = [];
97 295         1043  
98             #this next bit deals with an init_and_watch case where a category
99             #is deleted from the config file, we need to zero out the existing
100 295         771 #loggers so ones not in the config file not continue with their old
101 567         1182 #behavior --kg
102             next if $logger eq $ROOT_LOGGER;
103             $logger->{level} = undef;
104             $logger->level(); #set it from the hierarchy
105             }
106              
107 567 100       1710 # Clear all filters
108 272         415 Log::Log4perl::Filter::reset();
109 272         499 }
110              
111             ##################################################
112             ##################################################
113 295         963 my($class, $category, $level) = @_;
114              
115             print("_new: $class/$category/", defined $level ? $level : "undef",
116             "\n") if _INTERNAL_DEBUG;
117              
118             die "usage: __PACKAGE__->_new(category)" unless
119 569     569   1091 defined $category;
120            
121 569         723 $category =~ s/::/./g;
122              
123             # Have we created it previously?
124 569 50       1138 if(exists $LOGGERS_BY_NAME->{$category}) {
125             print "_new: exists already\n" if _INTERNAL_DEBUG;
126             return $LOGGERS_BY_NAME->{$category};
127 569         1152 }
128              
129             my $self = {
130 569 100       1381 category => $category,
131 384         482 num_appenders => 0,
132 384         841 additivity => 1,
133             level => $level,
134             layout => undef,
135 185         793 };
136              
137             bless $self, $class;
138              
139             $level ||= $self->level();
140              
141             # Save it in global structure
142             $LOGGERS_BY_NAME->{$category} = $self;
143 185         424  
144             $self->set_output_methods;
145 185   100     711  
146             print("Created logger $self ($category)\n") if _INTERNAL_DEBUG;
147              
148 185         400 return $self;
149             }
150 185         536  
151             ##################################################
152 185         343 ##################################################
153             my ($self) = @_;
154 185         336  
155             return $self->{ category };
156             }
157              
158             ##################################################
159             ##################################################
160 1     1 0 4 print "reset_all_output_methods: \n" if _INTERNAL_DEBUG;
161              
162 1         4 foreach my $loggername ( keys %$LOGGERS_BY_NAME){
163             $LOGGERS_BY_NAME->{$loggername}->set_output_methods;
164             }
165             $ROOT_LOGGER->set_output_methods;
166             }
167              
168 251     251 0 313 ##################################################
169             # Here's a big performance increase. Instead of having the logger
170 251         701 # calculate whether to log and whom to log to every time log() is called,
171 738         1489 # we calculate it once when the logger is created, and recalculate
172             # it if the config information ever changes.
173 251         547 #
174             ##################################################
175             my ($self) = @_;
176            
177             my (@appenders, %seen);
178              
179             my ($level) = $self->level();
180              
181             print "set_output_methods: $self->{category}/$level\n" if _INTERNAL_DEBUG;
182              
183             #collect the appenders in effect for this category
184 1183     1183 0 1700  
185             for(my $logger = $self; $logger; $logger = parent_logger($logger)) {
186 1183         1431  
187             foreach my $appender_name (@{$logger->{appender_names}}){
188 1183         1889  
189             #only one message per appender, (configurable)
190 1183         1362 next if $seen{$appender_name} ++ &&
191             $Log::Log4perl::one_message_per_appender;
192              
193             push (@appenders,
194 1183         2265 [$appender_name,
195             $APPENDER_BY_NAME{$appender_name},
196 1870         1997 ]
  1870         3065  
197             );
198             }
199 908 100 100     2019 last unless $logger->{additivity};
200             }
201              
202             #make a no-op coderef for inactive levels
203             my $noop = generate_noop_coderef();
204 902         1986  
205             #make a coderef
206             my $coderef = (! @appenders ? $noop : &generate_coderef(\@appenders));
207              
208 1870 100       3759 my %priority = %Log::Log4perl::Level::PRIORITY; #convenience and cvs
209              
210             # changed to >= from <= as level ints were reversed
211             foreach my $levelname (keys %priority){
212 1183         1853 if (Log::Log4perl::Level::isGreaterOrEqual($level,
213             $priority{$levelname}
214             )) {
215 1183 100       2564 print " ($priority{$levelname} <= $level)\n"
216             if _INTERNAL_DEBUG;
217 1183         5981 $self->{$levelname} = $coderef;
218             $self->{"is_$levelname"} = generate_is_xxx_coderef("1");
219             print "Setting is_$levelname to 1\n" if _INTERNAL_DEBUG;
220 1183         3261 }else{
221 10518 100       17009 print " ($priority{$levelname} > $level)\n" if _INTERNAL_DEBUG;
222             $self->{$levelname} = $noop;
223             $self->{"is_$levelname"} = generate_is_xxx_coderef("0");
224 5041         5101 print "Setting is_$levelname to 0\n" if _INTERNAL_DEBUG;
225             }
226 5041         8724  
227 5041         6250 print(" Setting [$self] $self->{category}.$levelname to ",
228 5041         5987 ($self->{$levelname} == $noop ? "NOOP" :
229             ("Coderef [$coderef]: " . scalar @appenders . " appenders")),
230 5477         5491 "\n") if _INTERNAL_DEBUG;
231 5477         6781 }
232 5477         6588 }
233 5477         6725  
234             ##################################################
235             ##################################################
236             my $appenders = shift;
237 10518         14741
238             print "generate_coderef: ", scalar @$appenders,
239             " appenders\n" if _INTERNAL_DEBUG;
240              
241             my $watch_check_code = generate_watch_code("logger", 1);
242              
243             return sub {
244             my $logger = shift;
245             my $level = pop;
246 786     786 0 1076  
247             my $message;
248 786         810 my $appenders_fired = 0;
249            
250             # Evaluate all parameters that need to be evaluated. Two kinds:
251 786         1122 #
252             # (1) It's a hash like { filter => "filtername",
253             # value => "value" }
254 499     499   692 # => filtername(value)
255 499         659 #
256             # (2) It's a code ref
257 499         567 # => coderef()
258 499         1408 #
259              
260             $message = [map { ref $_ eq "HASH" &&
261             exists $_->{filter} &&
262             ref $_->{filter} eq 'CODE' ?
263             $_->{filter}->($_->{value}) :
264             ref $_ eq "CODE" ?
265             $_->() : $_
266             } @_];
267              
268             print("coderef: $logger->{category}\n") if _INTERNAL_DEBUG;
269              
270 499         869 if(defined $Log::Log4perl::Config::WATCHER) {
271             return unless $watch_check_code->($logger, @_, $level);
272             }
273 541 100 66     2687  
    100          
274             foreach my $a (@$appenders) { #note the closure here
275             my ($appender_name, $appender) = @$a;
276              
277             print(" Sending message '<$message->[0]>' ($level) " .
278 499         872 "to $appender_name\n") if _INTERNAL_DEBUG;
279            
280 499 100       899 $appender->log(
281 20 100       66 #these get passed through to Log::Dispatch
282             { name => $appender_name,
283             level => $Log::Log4perl::Level::L4P_TO_LD{
284 497         806 $level},
285 553         934 message => $message,
286             },
287 553         622 #these we need
288             $logger->{category},
289             $level,
290             ) and $appenders_fired++;
291             # Only counting it if it returns a true value. Otherwise
292             # the appender threshold might have suppressed it after all.
293            
294             } #end foreach appenders
295            
296             return $appenders_fired;
297              
298             }; #end coderef
299 553 100       2364 }
300              
301             ##################################################
302             ##################################################
303             my $watch_delay_code;
304              
305             # This might seem crazy at first, but even in a Log4perl noop, we
306 497         1174 # need to check if the configuration changed in a init_and_watch
307             # situation. Why? Say, an application is running in a loop that
308 786         2964 # constantly tries to issue debug() messages, but they're suppressed by
309             # the current Log4perl configuration. If debug() (which is a noop
310             # here) wasn't watching the configuration for changes, it would never
311             # catch the case where someone bumps up the log level and expects
312             # the application to pick it up and start logging debug() statements.
313              
314 1183     1183 0 1328 my $watch_check_code = generate_watch_code("logger", 1);
315              
316             my $coderef;
317              
318             if(defined $Log::Log4perl::Config::WATCHER) {
319             $coderef = $watch_check_code;
320             } else {
321             $coderef = sub { undef };
322             }
323              
324             return $coderef;
325 1183         1744 }
326              
327 1183         1488 ##################################################
328             ##################################################
329 1183 100       1840 my($return_token) = @_;
330 43         51  
331             return generate_watch_code("checker", $return_token);
332 1140     41   2237 }
  41         67  
333              
334             ##################################################
335 1183         2693 ##################################################
336             my($type, $return_token) = @_;
337              
338             print "generate_watch_code:\n" if _INTERNAL_DEBUG;
339              
340             # No watcher configured, return a no-op as watch code.
341 10518     10518 0 12886 if(! defined $Log::Log4perl::Config::WATCHER) {
342             return sub { $return_token };
343 10518         12335 }
344              
345             my $cond = generate_watch_conditional();
346              
347             return sub {
348             print "exe_watch_code:\n" if _INTERNAL_DEBUG;
349 12487     12487 0 15253  
350             if(_INTERNAL_DEBUG) {
351 12487         11707 print "Next check: ",
352             "$Log::Log4perl::Config::Watch::NEXT_CHECK_TIME ",
353             " Now: ", time(), " Mod: ",
354 12487 100       17301 (stat($Log::Log4perl::Config::WATCHER->file()))[9],
355 12072     106   37224 "\n";
  106         272  
356             }
357              
358 415         521 if( $cond->() ) {
359             my $init_permitted = 1;
360              
361 63     63   76 if(exists $Log::Log4perl::Config::OPTS->{ preinit_callback } ) {
362             print "Calling preinit_callback\n" if _INTERNAL_DEBUG;
363 63         71 $init_permitted =
364             $Log::Log4perl::Config::OPTS->{ preinit_callback }->(
365             Log::Log4perl::Config->watcher()->file() );
366             print "Callback returned $init_permitted\n" if _INTERNAL_DEBUG;
367             }
368              
369             if( $init_permitted ) {
370             Log::Log4perl->init_and_watch();
371 63 100       112 } else {
372 6         17 # It was time to reinit, but init wasn't permitted.
373             # Return true, so that the logger continues as if
374 6 100       26 # it wasn't time to reinit.
375 2         4 return 1;
376             }
377 2         22  
378             my $logger = shift;
379 2         12 my $level = pop;
380              
381             # Forward call to new configuration
382 6 100       18 if($type eq "checker") {
383 5         47 return $logger->$level();
384              
385             } elsif( $type eq "logger") {
386             my $methodname = lc($level);
387              
388 1         4 # Bump up the caller level by three, since
389             # we've artificially introduced additional levels.
390             local $Log::Log4perl::caller_depth =
391 5         10 $Log::Log4perl::caller_depth + 3;
392 5         9  
393             # Get a new logger for the same category (the old
394             # logger might be obsolete because of the re-init)
395 5 100       17 $logger = Log::Log4perl::get_logger( $logger->{category} );
    50          
396 2         10  
397             $logger->$methodname(@_); # send the message
398             # to the new configuration
399 3         9 return undef; # Return false, so the logger finishes
400             # prematurely and doesn't log the same
401             # message again.
402             } else {
403 3         6 die "internal error: unknown type";
404             }
405             } else {
406             if(_INTERNAL_DEBUG) {
407             print "Conditional returned false\n";
408 3         11 }
409             return $return_token;
410 3         15 }
411             };
412 3         42 }
413              
414             ##################################################
415             ##################################################
416 0         0  
417             if(defined $Log::Log4perl::Config::Watch::SIGNAL_CAUGHT) {
418             # In this mode, we just check for the variable indicating
419 57         62 # that the signal has been caught
420             return sub {
421             return $Log::Log4perl::Config::Watch::SIGNAL_CAUGHT;
422 57         226 };
423             }
424 415         2199  
425             return sub {
426             return
427             ( time() > $Log::Log4perl::Config::Watch::NEXT_CHECK_TIME and
428             $Log::Log4perl::Config::WATCHER->change_detected() );
429             };
430             }
431 415 100   415 0 638  
432             ##################################################
433             ##################################################
434             my($string) = @_;
435 16     16   37  
436 110         349 if($string eq "") {
437             return undef; # root doesn't have a parent.
438             }
439              
440             my @components = split /\./, $string;
441 47   100 47   228
442             if(@components == 1) {
443 305         675 return "";
444             }
445              
446             pop @components;
447              
448             return join('.', @components);
449 2227     2227 0 3041 }
450              
451 2227 50       3242 ##################################################
452 0         0 ##################################################
453             my($self, $level, $dont_reset_all) = @_;
454              
455 2227         3990 # 'Set' function
456             if(defined $level) {
457 2227 100       3514 croak "invalid level '$level'"
458 1310         2661 unless Log::Log4perl::Level::is_valid($level);
459             if ($level =~ /\D/){
460             $level = Log::Log4perl::Level::to_priority($level);
461 917         1087 }
462             $self->{level} = $level;
463 917         1922  
464             &reset_all_output_methods
465             unless $dont_reset_all; #keep us from getting overworked
466             #if it's the config file calling us
467              
468             return $level;
469 1816     1816 0 3346 }
470              
471             # 'Get' function
472 1816 100       3143 if(defined $self->{level}) {
473 241 50       630 return $self->{level};
474             }
475 241 100       701  
476 3         7 for(my $logger = $self; $logger; $logger = parent_logger($logger)) {
477              
478 241         444 # Does the current logger have the level defined?
479              
480 241 100       532 if($logger->{category} eq "") {
481             # It's the root logger
482             return $ROOT_LOGGER->{level};
483             }
484 241         627
485             if(defined $LOGGERS_BY_NAME->{$logger->{category}}->{level}) {
486             return $LOGGERS_BY_NAME->{$logger->{category}}->{level};
487             }
488 1575 100       2896 }
489 773         1551  
490             # We should never get here because at least the root logger should
491             # have a level defined
492 802         1747 die "We should never get here.";
493             }
494              
495             ##################################################
496 1700 100       2817 # Get the parent of the current logger or undef
497             ##################################################
498 745         1534 my($logger) = @_;
499              
500             # Is it the root logger?
501 955 100       2625 if($logger->{category} eq "") {
502 57         144 # Root has no parent
503             return undef;
504             }
505              
506             # Go to the next defined (!) parent
507             my $parent_class = parent_string($logger->{category});
508 0         0  
509             while($parent_class ne "" and
510             ! exists $LOGGERS_BY_NAME->{$parent_class}) {
511             $parent_class = parent_string($parent_class);
512             $logger = $LOGGERS_BY_NAME->{$parent_class};
513             }
514              
515 2726     2726 0 3498 if($parent_class eq "") {
516             $logger = $ROOT_LOGGER;
517             } else {
518 2726 100       4447 $logger = $LOGGERS_BY_NAME->{$parent_class};
519             }
520 1141         2160  
521             return $logger;
522             }
523              
524 1585         2273 ##################################################
525             ##################################################
526 1585   100     3970 my($class) = @_;
527             return $ROOT_LOGGER;
528 642         897 }
529 642         1403  
530             ##################################################
531             ##################################################
532 1585 100       2362 my($self, $onoff, $no_reinit) = @_;
533 1310         1512  
534             if(defined $onoff) {
535 275         340 $self->{additivity} = $onoff;
536             }
537              
538 1585         2749 if( ! $no_reinit ) {
539             $self->set_output_methods();
540             }
541              
542             return $self->{additivity};
543             }
544 0     0 0 0  
545 0         0 ##################################################
546             ##################################################
547             my($class, $category) = @_;
548              
549             unless(defined $ROOT_LOGGER) {
550             Carp::confess "Internal error: Root Logger not initialized.";
551 5     5 0 15 }
552              
553 5 50       14 return $ROOT_LOGGER if $category eq "";
554 5         86  
555             my $logger = $class->_new($category);
556             return $logger;
557 5 100       63 }
558 2         8  
559             ##################################################
560             ##################################################
561 5         11 my($self, $appender, $dont_reset_all) = @_;
562              
563             # We take this as an indicator that we're initialized.
564             $INITIALIZED = 1;
565              
566             my $appender_name = $appender->name();
567 439     439 0 862  
568             $self->{num_appenders}++; #should this be inside the unless?
569 439 100       918  
570 1         167 # Add newly created appender to the end of the appender array
571             unless (grep{$_ eq $appender_name} @{$self->{appender_names}}){
572             $self->{appender_names} = [sort @{$self->{appender_names}},
573 438 100       1055 $appender_name];
574             }
575 274         625  
576 274         643 $APPENDER_BY_NAME{$appender_name} = $appender;
577              
578             reset_all_output_methods
579             unless $dont_reset_all; # keep us from getting overworked
580             # if it's the config file calling us
581              
582 214     214 0 1152 # For chaining calls ...
583             return $appender;
584             }
585 214         340  
586             ##################################################
587 214         796 ##################################################
588             my($self, $appender_name, $dont_reset_all, $sloppy) = @_;
589 214         371  
590             my %appender_names = map { $_ => 1 } @{$self->{appender_names}};
591            
592 214 100       305 if(!exists $appender_names{$appender_name}) {
  15         48  
  214         920  
593 213         320 die "No such appender: $appender_name" unless $sloppy;
  213         601  
594             return undef;
595             }
596              
597 214         447 delete $appender_names{$appender_name};
598             $self->{num_appenders}--;
599 214 100       482 $self->{appender_names} = [sort keys %appender_names];
600              
601             &reset_all_output_methods
602             unless $dont_reset_all;
603             }
604 214         412  
605             ##################################################
606             ##################################################
607             # If someone calls Logger->... and not Logger::...
608             shift if $_[0] eq __PACKAGE__;
609              
610 6     6 0 12 my($appender_name, $dont_reset_all) = @_;
611              
612 6         8 return 0 unless exists
  2         7  
  6         10  
613             $APPENDER_BY_NAME{$appender_name};
614 6 100       16  
615 4 50       6 # Remove the given appender from all loggers
616 4         6 # and delete all references to it, causing
617             # its DESTROY method to be called.
618             foreach my $logger (values %$LOGGERS_BY_NAME){
619 2         3 $logger->remove_appender($appender_name, 0, 1);
620 2         4 }
621 2         6 # Also remove it from the root logger
622             $ROOT_LOGGER->remove_appender($appender_name, 0, 1);
623 2 50       6
624             delete $APPENDER_BY_NAME{$appender_name};
625              
626             &reset_all_output_methods
627             unless $dont_reset_all;
628              
629             return 1;
630             }
631 1 50   1 0 4  
632             ##################################################
633 1         3 ##################################################
634             my($self) = @_;
635              
636 1 50       4 return $self->{num_appenders};
637             }
638              
639             ##################################################
640             # external api
641 1         3 ##################################################
642 3         6 my ($self, $priority, @messages) = @_;
643              
644             confess("log: No priority given!") unless defined($priority);
645 1         3  
646             # Just in case of 'init_and_watch' -- see Changes 0.21
647 1         3 $_[0] = $LOGGERS_BY_NAME->{$_[0]->{category}} if
648             defined $Log::Log4perl::Config::WATCHER;
649 1 50       4  
650             init_warn() unless $INITIALIZED or $NON_INIT_WARNED;
651              
652 1         2 croak "priority $priority isn't numeric" if ($priority =~ /\D/);
653              
654             my $which = Log::Log4perl::Level::to_level($priority);
655              
656             $self->{$which}->($self, @messages,
657             Log::Log4perl::Level::to_level($priority));
658 0     0 0 0 }
659              
660 0         0 ######################################################################
661             #
662             # create_custom_level
663             # creates a custom level
664             # in theory, could be used to create the default ones
665             ######################################################################
666             ######################################################################
667 11     11 0 608 my $level = shift || die("create_custom_level: " .
668             "forgot to pass in a level string!");
669 11 50       20 my $after = shift || die("create_custom_level: " .
670             "forgot to pass in a level after which to " .
671             "place the new level!");
672             my $syslog_equiv = shift; # can be undef
673 11 50       18 my $log_dispatch_level = shift; # optional
674              
675 11 0 33     21 ## only let users create custom levels before initialization
676              
677 11 50       26 die("create_custom_level must be called before init or " .
678             "first get_logger() call") if ($INITIALIZED);
679 11         24  
680             my %PRIORITY = %Log::Log4perl::Level::PRIORITY; #convenience
681 11         23  
682             die("create_custom_level: no such level \"$after\"! Use one of: ",
683             join(", ", sort keys %PRIORITY)) unless $PRIORITY{$after};
684              
685             # figure out new int value by AFTER + (AFTER+ 1) / 2
686              
687             my $next_prio = Log::Log4perl::Level::get_lower_level($PRIORITY{$after}, 1);
688             my $cust_prio = int(($PRIORITY{$after} + $next_prio) / 2);
689              
690             die(qq{create_custom_level: Calculated level of $cust_prio already exists!
691             This should only happen if you've made some insane number of custom
692             levels (like 15 one after another)
693 33   50 33 0 14846 You can usually fix this by re-arranging your code from:
694             create_custom_level("cust1", X);
695 33   50     57 create_custom_level("cust2", X);
696             create_custom_level("cust3", X);
697             create_custom_level("cust4", X);
698 33         42 create_custom_level("cust5", X);
699 33         36 into:
700             create_custom_level("cust3", X);
701             create_custom_level("cust5", X);
702             create_custom_level("cust4", 4);
703 33 100       66 create_custom_level("cust2", cust3);
704             create_custom_level("cust1", cust2);
705             }) if (${Log::Log4perl::Level::LEVELS{$cust_prio}});
706 32         273  
707             Log::Log4perl::Level::add_priority($level, $cust_prio, $syslog_equiv,
708             $log_dispatch_level);
709 32 50       91  
710             print("Adding prio $level at $cust_prio\n") if _INTERNAL_DEBUG;
711              
712             # get $LEVEL into namespace of Log::Log4perl::Logger to
713 32         66 # create $logger->foo nd $logger->is_foo
714 32         73 my $name = "Log::Log4perl::Logger::";
715             my $key = $level;
716              
717             no strict qw(refs);
718             # be sure to use ${Log...} as CVS adds log entries for Log
719             *{"$name$key"} = \${Log::Log4perl::Level::PRIORITY{$level}};
720              
721             # now, stick it in the caller's namespace
722             $name = caller(0) . "::";
723             *{"$name$key"} = \${Log::Log4perl::Level::PRIORITY{$level}};
724             use strict qw(refs);
725              
726             create_log_level_methods($level);
727              
728             return 0;
729              
730             }
731 32 100       79  
732             ########################################
733 31         69 #
734             # if we were hackin' lisp (or scheme), we'd be returning some lambda
735             # expressions. But we aren't. :) So we'll just create some strings and
736 31         33 # eval them.
737             ########################################
738             ########################################
739             my $level = shift || die("create_log_level_methods: " .
740 31         47 "forgot to pass in a level string!");
741 31         38 my $lclevel = lc($level);
742             my $levelint = uc($level) . "_INT";
743 70     70   648 my $initial_cap = ucfirst($lclevel);
  70         144  
  70         5018  
744              
745 31         39 no strict qw(refs);
  31         143  
746              
747             # This is a bit better way to create code on the fly than eval'ing strings.
748 31         65 # -erik
749 31         45  
  31         78  
750 70     70   386 *{__PACKAGE__ . "::$lclevel"} = sub {
  70         168  
  70         7046  
751             if(_INTERNAL_DEBUG) {
752 31         64 my $level_disp = (defined $_[0]->{level} ? $_[0]->{level}
753             : "[undef]");
754 31         143 print "$lclevel: ($_[0]->{category}/$level_disp) [@_]\n";
755             }
756             init_warn() unless $INITIALIZED or $NON_INIT_WARNED;
757             $_[0]->{$level}->(@_, $level) if defined $_[0]->{$level};
758             };
759              
760             # Added these to have is_xxx functions as fast as xxx functions
761             # -ms
762            
763             my $islevel = "is_" . $level;
764             my $islclevel = "is_" . $lclevel;
765              
766 591   50 591 0 1127 *{__PACKAGE__ . "::is_$lclevel"} = sub {
767             $_[0]->{$islevel}->($_[0], $islclevel);
768 591         931 };
769 591         897
770 591         829 # Add the isXxxEnabled() methods as identical to the is_xxx
771             # functions. - dviner
772 70     70   451
  70         163  
  70         15641  
773             *{__PACKAGE__ . "::is".$initial_cap."Enabled"} =
774             \&{__PACKAGE__ . "::is_$lclevel"};
775            
776             use strict qw(refs);
777 591         2618  
778 436     436   6012406 return 0;
779             }
780              
781             #now lets autogenerate the logger subs based on the defined priorities
782             foreach my $level (keys %Log::Log4perl::Level::PRIORITY){
783 436 50 66     866 create_log_level_methods($level);
784 436 50       1399 }
785 591         2034  
786             ##################################################
787             ##################################################
788             CORE::warn "Log4perl: Seems like no initialization happened. " .
789             "Forgot to call init()?\n";
790 591         1087 # Only tell this once;
791 591         842 $NON_INIT_WARNED = 1;
792             }
793 591         2054  
794 144     144   2590 #######################################################
795 591         1783 # call me from a sub-func to spew the sub-func's caller
796             #######################################################
797             my $message = join ('', @_);
798              
799             my $caller_offset =
800 591         1733 Log::Log4perl::caller_depth_offset(
801 591         750 $Log::Log4perl::caller_depth + 1 );
  591         1128  
802              
803 70     70   430 my ($pack, $file, $line) = caller($caller_offset);
  70         182  
  70         86037  
804              
805 591         1026 if (not chomp $message) { # no newline
806             $message .= " at $file line $line";
807              
808             # Someday, we'll use Threads. Really.
809             if (defined &Thread::tid) {
810             my $tid = Thread->self->tid;
811             $message .= " thread $tid" if $tid;
812             }
813             }
814              
815             return ($message, "\n");
816 1     1 0 44 }
817              
818             #######################################################
819 1         5 #######################################################
820             my $self = shift;
821             CORE::warn(callerline($self->warning_render(@_)));
822             }
823              
824             #######################################################
825             #######################################################
826 32     32 0 66 my $self = shift;
827             my $arg = $_[0];
828 32         96  
829             my($msg) = callerline($self->warning_render(@_));
830              
831             if($DIE_DEBUG) {
832 32         165 $DIE_DEBUG_BUFFER = "DIE_DEBUG: $msg";
833             } else {
834 32 100       81 if( $Log::Log4perl::STRINGIFY_DIE_MESSAGE ) {
835 27         62 die("$msg\n");
836             }
837             die $arg;
838 27 50       53 }
839 0         0 }
840 0 0       0  
841             ##################################################
842             ##################################################
843             my $self = shift;
844 32         190  
845             local $Log::Log4perl::caller_depth =
846             $Log::Log4perl::caller_depth + 1;
847              
848             if ($self->is_warn()) {
849             # Since we're one caller level off now, compensate for that.
850 9     9 0 12 my @chomped = @_;
851 9         18 chomp($chomped[-1]);
852             $self->warn(@chomped);
853             }
854              
855             $self->and_warn(@_);
856             }
857 11     11 0 14  
858 11         12 ##################################################
859             ##################################################
860 11         21 my $self = shift;
861              
862 11 100       24 local $Log::Log4perl::caller_depth =
863 1         5 $Log::Log4perl::caller_depth + 1;
864              
865 10 100       20 if ($self->is_fatal()) {
866 9         60 # Since we're one caller level off now, compensate for that.
867             my @chomped = @_;
868 1         7 chomp($chomped[-1]);
869             $self->fatal(@chomped);
870             }
871              
872             $Log::Log4perl::LOGDIE_MESSAGE_ON_STDERR ?
873             $self->and_die(@_) :
874             exit($Log::Log4perl::LOGEXIT_CODE);
875 6     6 0 1286 }
876              
877 6         11 ##################################################
878             ##################################################
879             my $self = shift;
880 6 100       13  
881             local $Log::Log4perl::caller_depth =
882 4         9 $Log::Log4perl::caller_depth + 1;
883 4         8  
884 4         9 if ($self->is_fatal()) {
885             # Since we're one caller level off now, compensate for that.
886             my @chomped = @_;
887 6         15 chomp($chomped[-1]);
888             $self->fatal(@chomped);
889             }
890              
891             exit $Log::Log4perl::LOGEXIT_CODE;
892             }
893 8     8 0 2470  
894             ##################################################
895 8         11 # clucks and carps are WARN level
896             ##################################################
897             my $self = shift;
898 8 100       16  
899             local $Log::Log4perl::caller_depth =
900 7         14 $Log::Log4perl::caller_depth + 1;
901 7         13  
902 7         11 local $Carp::CarpLevel =
903             $Carp::CarpLevel + 1;
904              
905             my $msg = $self->warning_render(@_);
906 8 50       28  
907             if ($self->is_warn()) {
908             my $message = Carp::longmess($msg);
909             foreach (split(/\n/, $message)) {
910             $self->warn("$_\n");
911             }
912             }
913 0     0 0 0  
914             Carp::cluck($msg);
915 0         0 }
916              
917             ##################################################
918 0 0       0 ##################################################
919             my $self = shift;
920 0         0  
921 0         0 local $Carp::CarpLevel = $Carp::CarpLevel + 1;
922 0         0  
923             local $Log::Log4perl::caller_depth =
924             $Log::Log4perl::caller_depth + 1;
925 0         0  
926             my $msg = $self->warning_render(@_);
927              
928             if ($self->is_warn()) {
929             my $message = Carp::shortmess($msg);
930             foreach (split(/\n/, $message)) {
931             $self->warn("$_\n");
932 4     4 0 1170 }
933             }
934 4         8  
935             Carp::carp($msg);
936             }
937 4         5  
938             ##################################################
939             # croaks and confess are FATAL level
940 4         9 ##################################################
941             ##################################################
942 4 100       10 my $self = shift;
943 2         109 my $arg = $_[0];
944 2         181  
945 6         16 my $msg = $self->warning_render(@_);
946              
947             local $Carp::CarpLevel =
948             $Carp::CarpLevel + 1;
949 4         219  
950             local $Log::Log4perl::caller_depth =
951             $Log::Log4perl::caller_depth + 1;
952              
953             if ($self->is_fatal()) {
954             my $message = Carp::shortmess($msg);
955 11     11 0 1189 foreach (split(/\n/, $message)) {
956             $self->fatal("$_\n");
957 11         20 }
958             }
959 11         15  
960             my $croak_msg = $arg;
961              
962 11         19 if( $Log::Log4perl::STRINGIFY_DIE_MESSAGE ) {
963             $croak_msg = $msg;
964 11 100       36 }
965 9         889  
966 9         256 $Log::Log4perl::LOGDIE_MESSAGE_ON_STDERR ?
967 13         36 Carp::croak($croak_msg) :
968             exit($Log::Log4perl::LOGEXIT_CODE);
969             }
970              
971 11         1014 ##################################################
972             ##################################################
973             my $self = shift;
974             my $arg = $_[0];
975              
976             local $Carp::CarpLevel =
977             $Carp::CarpLevel + 1;
978              
979 7     7 0 1220 local $Log::Log4perl::caller_depth =
980 7         11 $Log::Log4perl::caller_depth + 1;
981              
982 7         17 my $msg = $self->warning_render(@_);
983              
984 7         14 if ($self->is_fatal()) {
985             my $message = Carp::longmess($msg);
986             foreach (split(/\n/, $message)) {
987 7         10 $self->fatal("$_\n");
988             }
989             }
990 7 100       14  
991 6         543 my $confess_msg = $arg;
992 6         384  
993 15         40 if( $Log::Log4perl::STRINGIFY_DIE_MESSAGE ) {
994             $confess_msg = $msg;
995             }
996              
997 7         13 $Log::Log4perl::LOGDIE_MESSAGE_ON_STDERR ?
998             confess($confess_msg) :
999 7 100       22 exit($Log::Log4perl::LOGEXIT_CODE);
1000 6         10 }
1001              
1002             ##################################################
1003             # in case people prefer to use error for warning
1004 7 50       501 ##################################################
1005             ##################################################
1006             my $self = shift;
1007              
1008             local $Log::Log4perl::caller_depth =
1009             $Log::Log4perl::caller_depth + 1;
1010              
1011 5     5 0 1293 if ($self->is_error()) {
1012 5         8 $self->error(@_);
1013             }
1014 5         9  
1015             $self->and_warn(@_);
1016             }
1017 5         8  
1018             ##################################################
1019             ##################################################
1020 5         10 my $self = shift;
1021              
1022 5 100       11 local $Log::Log4perl::caller_depth =
1023 4         208 $Log::Log4perl::caller_depth + 1;
1024 4         451  
1025 13         33 my $msg = $self->warning_render(@_);
1026              
1027             if ($self->is_error()) {
1028             $self->error($msg);
1029 5         11 }
1030              
1031 5 100       10 $Log::Log4perl::LOGDIE_MESSAGE_ON_STDERR ?
1032 4         6 $self->and_die($msg) :
1033             exit($Log::Log4perl::LOGEXIT_CODE);
1034             }
1035              
1036 5 50       234 ##################################################
1037             ##################################################
1038             my ($self) = shift;
1039             return $self->dec_level(@_);
1040             }
1041              
1042             ##################################################
1043             ##################################################
1044             my ($self, $delta) = @_;
1045 3     3 0 635  
1046             $delta ||= 1;
1047 3         6  
1048             $self->level(Log::Log4perl::Level::get_higher_level($self->level(),
1049             $delta));
1050 3 100       8  
1051 2         6 $self->set_output_methods;
1052             }
1053              
1054 3         9 ##################################################
1055             ##################################################
1056             my ($self) = shift;
1057             return $self->inc_level(@_);
1058             }
1059              
1060 3     3 0 671 ##################################################
1061             ##################################################
1062 3         6 my ($self, $delta) = @_;
1063              
1064             $delta ||= 1;
1065 3         8  
1066             $self->level(Log::Log4perl::Level::get_lower_level($self->level(), $delta));
1067 3 100       9  
1068 2         6 $self->set_output_methods;
1069             }
1070              
1071             1;
1072 3 50       23  
1073              
1074             =encoding utf8
1075              
1076             =head1 NAME
1077              
1078             Log::Log4perl::Logger - Main Logger Class
1079 4     4 0 8  
1080 4         10 =head1 SYNOPSIS
1081              
1082             # It's not here
1083              
1084             =head1 DESCRIPTION
1085              
1086 2     2 0 5 While everything that makes Log4perl tick is implemented here,
1087             please refer to L<Log::Log4perl> for documentation.
1088 2   50     7  
1089             =head1 LICENSE
1090 2         5  
1091             Copyright 2002-2013 by Mike Schilli E<lt>m@perlmeister.comE<gt>
1092             and Kevin Goess E<lt>cpan@goess.orgE<gt>.
1093 2         6  
1094             This library is free software; you can redistribute it and/or modify
1095             it under the same terms as Perl itself.
1096              
1097             =head1 AUTHOR
1098              
1099 1     1 0 3 Please contribute patches to the project on Github:
1100 1         4  
1101             http://github.com/mschilli/log4perl
1102              
1103             Send bug reports or requests for enhancements to the authors via our
1104              
1105             MAILING LIST (questions, bug reports, suggestions/patches):
1106 5     5 0 13 log4perl-devel@lists.sourceforge.net
1107              
1108 5   100     20 Authors (please contact them via the list above, not directly):
1109             Mike Schilli <m@perlmeister.com>,
1110 5         11 Kevin Goess <cpan@goess.org>
1111              
1112 5         12 Contributors (in alphabetical order):
1113             Ateeq Altaf, Cory Bennett, Jens Berthold, Jeremy Bopp, Hutton
1114             Davidson, Chris R. Donnelly, Matisse Enzer, Hugh Esco, Anthony
1115             Foiani, James FitzGibbon, Carl Franks, Dennis Gregorovic, Andy
1116             Grundman, Paul Harrington, Alexander Hartmaier David Hull,
1117             Robert Jacobson, Jason Kohles, Jeff Macdonald, Markus Peter,
1118             Brett Rann, Peter Rabbitson, Erik Selberg, Aaron Straup Cope,
1119             Lars Thegler, David Viner, Mac Yang.
1120