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 /;
28 %EXPORT_TAGS = ( level => [ qw/ NONE ERROR WARN INFO DEBUG INTERNAL / ] );
30 my $config; # config handle
31 my $loglevel; # global log level
32 my $logfile; # log file
33 my $facility; # syslog facility
34 my $actlog; # activity log syslog facility
35 my $service = "osrf"; # default service name
36 my $syslog_enabled = 0; # is syslog enabled?
37 my $logfile_enabled = 1; # are we logging to a file?
38 my $logdir; # log file directory
41 sub ACTIVITY { return -1; }
42 sub NONE { return 0; }
43 sub ERROR { return 1; }
44 sub WARN { return 2; }
45 sub INFO { return 3; }
46 sub DEBUG { return 4; }
47 sub INTERNAL { return 5; }
48 sub ALL { return 100; }
50 # load up our config options
53 return if defined $config;
55 $config = OpenSRF::Utils::Config->current;
56 if( !defined($config) ) {
58 warn "*** Logger found no config. Using STDERR ***\n";
61 $loglevel = $config->bootstrap->debug;
62 if($loglevel =~ /error/i){ $loglevel = ERROR(); }
63 elsif($loglevel =~ /warn/i){ $loglevel = WARN(); }
64 elsif($loglevel =~ /info/i){ $loglevel = INFO(); }
65 elsif($loglevel =~ /debug/i){ $loglevel = DEBUG(); }
66 elsif($loglevel =~ /internal/i){ $loglevel = INTERNAL(); }
67 else{$loglevel= INFO(); }
69 $logfile = $config->bootstrap->logfile;
71 if($logfile =~ /^syslog:/) {
74 $logfile =~ s/^syslog://;
76 $facility = _fac_to_const($facility);
77 if(!$facility) { $facility = LOG_LOCAL0; }
78 $actlog = $config->bootstrap->actlog;
79 if(!$actlog) { $actlog = "local1"; }
80 $actlog = _fac_to_const($actlog);
83 my $logdir = $config->bootstrap->log_dir;
84 $logfile = "$logdir/$logfile";
87 #warn "Level: $loglevel, Fac: $facility, Act: $actlog\n";
92 return LOG_LOCAL0 unless $name;
93 return LOG_LOCAL0 if $name =~ /local0/i;
94 return LOG_LOCAL1 if $name =~ /local1/i;
95 return LOG_LOCAL2 if $name =~ /local2/i;
96 return LOG_LOCAL3 if $name =~ /local3/i;
97 return LOG_LOCAL4 if $name =~ /local4/i;
98 return LOG_LOCAL5 if $name =~ /local5/i;
99 return LOG_LOCAL6 if $name =~ /local6/i;
100 return LOG_LOCAL7 if $name =~ /local7/i;
105 set_config() unless defined($config);
106 return $syslog_enabled;
110 set_config() unless defined($config);
111 return $logfile_enabled;
115 my( $self, $svc ) = @_;
119 openlog($service, 0, $facility);
124 my( $self, $msg, $level ) = @_;
125 $level = ERROR() unless defined ($level);
126 _log_message( $msg, $level );
130 my( $self, $msg, $level ) = @_;
131 $level = WARN() unless defined ($level);
132 _log_message( $msg, $level );
136 my( $self, $msg, $level ) = @_;
137 $level = INFO() unless defined ($level);
138 _log_message( $msg, $level );
142 my( $self, $msg, $level ) = @_;
143 $level = DEBUG() unless defined ($level);
144 _log_message( $msg, $level );
148 my( $self, $msg, $level ) = @_;
149 $level = INTERNAL() unless defined ($level);
150 _log_message( $msg, $level );
154 my( $self, $msg ) = @_;
155 _log_message( $msg, ACTIVITY() );
158 # for backwards compability
160 my( $self, $msg, $level ) = @_;
161 $level = DEBUG() unless defined ($level);
162 _log_message( $msg, $level );
168 my( $msg, $level ) = @_;
169 return if $level > $loglevel;
173 if ($level == ERROR()) {$l = LOG_ERR, $n = "ERR "; }
174 elsif ($level == WARN()) {$l = LOG_WARNING, $n = "WARN"; }
175 elsif ($level == INFO()) {$l = LOG_INFO, $n = "INFO"; }
176 elsif ($level == DEBUG()) {$l = LOG_DEBUG, $n = "DEBG"; }
177 elsif ($level == INTERNAL()){$l = LOG_DEBUG, $n = "INTL"; }
178 elsif ($level == ACTIVITY()){$l = LOG_INFO, $n = "ACT"; $fac = $actlog}
180 #my( $pack, $file, $line_no ) = @caller;
181 if( is_syslog() ) { syslog( $fac | $l, $msg ); }
182 elsif( is_filelog() ) { _write_file($msg); }
188 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
189 $year += 1900; $mon += 1;
190 sysopen( SINK, $logfile, O_NONBLOCK|O_WRONLY|O_APPEND|O_CREAT )
191 or die "Cannot sysopen $logfile: $!";
192 binmode(SINK, ':utf8');
193 print SINK "[$year-$mon-$mday $hour:$min:$sec] $service $msg\n";