bef1f02dab14652a8f1f21b416ddf5b1a413a1a5
[Evergreen.git] / OpenSRF / src / perlmods / OpenSRF / Utils / Logger.pm
1 package OpenSRF::Utils::Logger;
2 use strict;
3 use vars qw($AUTOLOAD @EXPORT_OK %EXPORT_TAGS);
4 use Exporter;
5 use Unix::Syslog qw(:macros :subs);
6 use base qw/OpenSRF Exporter/;
7 use FileHandle;
8 use Time::HiRes qw(gettimeofday);
9 use OpenSRF::Utils::Config;
10 use Fcntl;
11
12 =head1
13
14 Logger code
15
16 my $logger = OpenSRF::Utils::Logger;
17 $logger->error( $msg );
18
19 For backwards compability, a log level may also be provided to each log
20 function thereby overriding the level defined by the function.
21
22 i.e. $logger->error( $msg, WARN );  # logs at log level WARN
23
24 =cut
25
26 @EXPORT_OK = qw/ NONE ERROR WARN INFO DEBUG INTERNAL /;
27
28 %EXPORT_TAGS = ( level => [ qw/ NONE ERROR WARN INFO DEBUG INTERNAL / ] );
29
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
39
40 # log levels
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; }
49
50 # load up our config options
51 sub set_config {
52
53         return if defined $config;
54
55         $config = OpenSRF::Utils::Config->current;
56         if( !defined($config) ) {
57                 $loglevel = INFO();
58                 warn "*** Logger found no config.  Using STDERR ***\n";
59         }
60
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(); }
68
69         $logfile = $config->bootstrap->logfile;
70         
71         if($logfile =~ /^syslog/) {
72                 $syslog_enabled = 1;
73                 $logfile_enabled = 0;
74                 $logfile =~ s/^syslog://;
75                 $facility = $logfile;
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);
81
82         } else {
83                 my $logdir = $config->bootstrap->log_dir;
84                 $logfile = "$logdir/$logfile";
85         }
86
87         #warn "Level: $loglevel, Fac: $facility, Act: $actlog\n";
88 }
89
90 sub _fac_to_const {
91         my $name = shift;
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;
101         return LOG_LOCAL0;
102 }
103
104 sub is_syslog {
105         set_config() unless defined($config);
106         return $syslog_enabled;
107 }
108
109 sub is_filelog {
110         set_config() unless defined($config);
111         return $logfile_enabled;
112 }
113
114 sub set_service {
115         my( $self, $svc ) = @_;
116         $service = $svc;        
117         if( is_syslog() ) {
118                 closelog();
119                 openlog($service, 0, $facility);
120         }
121 }
122
123 sub error {
124         my( $self, $msg, $level ) = @_;
125         $level = ERROR() unless defined ($level);
126         _log_message( $msg, $level );
127 }
128
129 sub warn {
130         my( $self, $msg, $level ) = @_;
131         $level = WARN() unless defined ($level);
132         _log_message( $msg, $level );
133 }
134
135 sub info {
136         my( $self, $msg, $level ) = @_;
137         $level = INFO() unless defined ($level);
138         _log_message( $msg, $level );
139 }
140
141 sub debug {
142         my( $self, $msg, $level ) = @_;
143         $level = DEBUG() unless defined ($level);
144         _log_message( $msg, $level );
145 }
146
147 sub internal {
148         my( $self, $msg, $level ) = @_;
149         $level = INTERNAL() unless defined ($level);
150         _log_message( $msg, $level );
151 }
152
153 sub activity {
154         my( $self, $msg ) = @_;
155         _log_message( $msg, ACTIVITY() );
156 }
157
158 # for backwards compability
159 sub transport {
160         my( $self, $msg, $level ) = @_;
161         $level = DEBUG() unless defined ($level);
162         _log_message( $msg, $level );
163 }
164
165
166
167 sub _log_message {
168         my( $msg, $level ) = @_;
169         return if $level > $loglevel;
170         my $l; my $n; 
171         my $fac = $facility;
172
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}
179
180         #my( $pack, $file, $line_no ) = @caller;
181         if( is_syslog() ) { syslog( $fac | $l, $msg ); }
182         elsif( is_filelog() ) { _write_file($msg); }
183 }
184
185
186 sub _write_file {
187         my $msg = shift;
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";
194         close( SINK );
195 }
196
197
198
199 1;