1 package OpenSRF::Utils::Logger;
3 use vars qw($AUTOLOAD @EXPORT_OK %EXPORT_TAGS);
5 use Unix::Syslog qw(:macros :subs);
6 use base qw/OpenSRF Exporter/;
8 use Time::HiRes qw(gettimeofday);
9 use OpenSRF::Utils::Config;
16 my $logger = OpenSRF::Utils::Logger;
17 $logger->error( $msg );
19 For backwards compability, a log level may also be provided to each log
20 function thereby overriding the level defined by the function.
22 i.e. $logger->error( $msg, WARN ); # logs at log level WARN
26 @EXPORT_OK = qw/ NONE ERROR WARN INFO DEBUG INTERNAL /;
27 push @EXPORT_OK, '$logger';
29 %EXPORT_TAGS = ( level => [ qw/ NONE ERROR WARN INFO DEBUG INTERNAL / ], logger => [ '$logger' ] );
31 my $config; # config handle
32 my $loglevel; # global log level
33 my $logfile; # log file
34 my $facility; # syslog facility
35 my $actfac; # activity log syslog facility
36 my $actfile; # activity log file
37 my $service = $0; # default service name
38 my $syslog_enabled = 0; # is syslog enabled?
39 my $act_syslog_enabled = 0; # is syslog enabled?
40 my $logfile_enabled = 1; # are we logging to a file?
41 my $act_logfile_enabled = 1; # are we logging to a file?
42 my $logdir; # log file directory
44 our $logger = "OpenSRF::Utils::Logger";
47 sub ACTIVITY { return -1; }
48 sub NONE { return 0; }
49 sub ERROR { return 1; }
50 sub WARN { return 2; }
51 sub INFO { return 3; }
52 sub DEBUG { return 4; }
53 sub INTERNAL { return 5; }
54 sub ALL { return 100; }
56 # load up our config options
59 return if defined $config;
61 $config = OpenSRF::Utils::Config->current;
62 if( !defined($config) ) {
64 warn "*** Logger found no config. Using STDERR ***\n";
67 $loglevel = $config->bootstrap->debug;
68 if($loglevel =~ /error/i){ $loglevel = ERROR(); }
69 elsif($loglevel =~ /warn/i){ $loglevel = WARN(); }
70 elsif($loglevel =~ /info/i){ $loglevel = INFO(); }
71 elsif($loglevel =~ /debug/i){ $loglevel = DEBUG(); }
72 elsif($loglevel =~ /internal/i){ $loglevel = INTERNAL(); }
73 else{$loglevel= INFO(); }
75 my $logdir = $config->bootstrap->log_dir;
77 $logfile = $config->bootstrap->logfile;
78 if($logfile =~ /^syslog/) {
81 $logfile =~ s/^syslog:?//;
84 $facility = _fac_to_const($facility);
85 openlog($service, 0, $facility);
87 } else { $logfile = "$logdir/$logfile"; }
89 $actfile = $config->bootstrap->actlog;
90 if($actfile =~ /^syslog/) {
91 $act_syslog_enabled = 1;
92 $act_logfile_enabled = 0;
93 $actfile =~ s/^syslog:?//;
94 $actfac = $actfile || "local1";
96 $actfac = _fac_to_const($actfac);
98 } else { $actfile = "$logdir/$actfile"; }
100 #warn "Level: $loglevel, Fac: $facility, Act: $actfac\n";
105 return LOG_LOCAL0 unless $name;
106 return LOG_LOCAL0 if $name =~ /local0/i;
107 return LOG_LOCAL1 if $name =~ /local1/i;
108 return LOG_LOCAL2 if $name =~ /local2/i;
109 return LOG_LOCAL3 if $name =~ /local3/i;
110 return LOG_LOCAL4 if $name =~ /local4/i;
111 return LOG_LOCAL5 if $name =~ /local5/i;
112 return LOG_LOCAL6 if $name =~ /local6/i;
113 return LOG_LOCAL7 if $name =~ /local7/i;
119 return $syslog_enabled;
124 return $act_syslog_enabled;
129 return $logfile_enabled;
134 return $act_logfile_enabled;
138 my( $self, $svc ) = @_;
142 openlog($service, 0, $facility);
147 my( $self, $msg, $level ) = @_;
148 $level = ERROR() unless defined ($level);
149 _log_message( $msg, $level );
153 my( $self, $msg, $level ) = @_;
154 $level = WARN() unless defined ($level);
155 _log_message( $msg, $level );
159 my( $self, $msg, $level ) = @_;
160 $level = INFO() unless defined ($level);
161 _log_message( $msg, $level );
165 my( $self, $msg, $level ) = @_;
166 $level = DEBUG() unless defined ($level);
167 _log_message( $msg, $level );
171 my( $self, $msg, $level ) = @_;
172 $level = INTERNAL() unless defined ($level);
173 _log_message( $msg, $level );
177 my( $self, $msg ) = @_;
178 _log_message( $msg, ACTIVITY() );
181 # for backward compability
183 my( $self, $msg, $level ) = @_;
184 $level = DEBUG() unless defined ($level);
185 _log_message( $msg, $level );
191 my( $msg, $level ) = @_;
192 return if $level > $loglevel;
197 if ($level == ERROR()) {$l = LOG_ERR; $n = "ERR "; }
198 elsif ($level == WARN()) {$l = LOG_WARNING; $n = "WARN"; }
199 elsif ($level == INFO()) {$l = LOG_INFO; $n = "INFO"; }
200 elsif ($level == DEBUG()) {$l = LOG_DEBUG; $n = "DEBG"; }
201 elsif ($level == INTERNAL()) {$l = LOG_DEBUG; $n = "INTL"; }
202 elsif ($level == ACTIVITY()) {$l = LOG_INFO; $n = "ACT"; $fac = $actfac; }
204 #my( $pack, $file, $line_no ) = @caller;
206 # help syslog with the formatting
207 $msg =~ s/\%/\%\%/gso if( is_act_syslog() or is_syslog() );
209 $msg = "[$n:"."$$".":::] $msg";
211 $msg = substr($msg, 0, 2000);
213 if( $level == ACTIVITY() ) {
214 if( is_act_syslog() ) { syslog( $fac | $l, $msg ); }
215 elsif( is_act_filelog() ) { _write_file( $msg, 1 ); }
218 if( is_syslog() ) { syslog( $fac | $l, $msg ); }
219 elsif( is_filelog() ) { _write_file($msg); }
225 my( $msg, $isact) = @_;
227 $file = $actfile if $isact;
228 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
229 $year += 1900; $mon += 1;
230 sysopen( SINK, $file, O_NONBLOCK|O_WRONLY|O_APPEND|O_CREAT )
231 or die "Cannot sysopen $logfile: $!";
232 binmode(SINK, ':utf8');
233 print SINK "[$year-$mon-$mday $hour:$min:$sec] $service $msg\n";