]> git.evergreen-ils.org Git - Evergreen.git/blob - OpenSRF/src/utils/log.c
c07535f248baef1931c4b25922723924739bfe91
[Evergreen.git] / OpenSRF / src / utils / log.c
1 #include "log.h"
2
3 int __osrfLogType                                       = -1;
4 int __osrfLogFacility                   = LOG_LOCAL0;
5 int __osrfLogActFacility                = LOG_LOCAL1;
6 char* __osrfLogFile                             = NULL;
7 char* __osrfLogAppname                  = NULL;
8 int __osrfLogLevel                              = OSRF_LOG_INFO;
9 int __osrfLogActivityEnabled    = 1;
10
11
12 void osrfLogInit( int type, const char* appname, int maxlevel ) {
13         osrfLogSetType(type);
14         if(appname) osrfLogSetAppname(appname);
15         osrfLogSetLevel(maxlevel);
16         if( type == OSRF_LOG_TYPE_SYSLOG ) 
17                 openlog(__osrfLogAppname, 0, __osrfLogFacility );
18 }
19
20 void osrfLogSetType( int logtype ) { 
21         if( logtype != OSRF_LOG_TYPE_FILE &&
22                         logtype != OSRF_LOG_TYPE_SYSLOG ) {
23                 fprintf(stderr, "Unrecognized log type.  Logging to stderr\n");
24                 return;
25         }
26         __osrfLogType = logtype; 
27 }
28
29 void osrfLogSetFile( const char* logfile ) {
30         if(!logfile) return;
31         if(__osrfLogFile) free(__osrfLogFile);
32         __osrfLogFile = strdup(logfile);
33 }
34
35 void osrfLogSetActivityEnabled( int enabled ) {
36         __osrfLogActivityEnabled = enabled;
37 }
38
39 void osrfLogSetAppname( const char* appname ) {
40         if(!appname) return;
41         if(__osrfLogAppname) free(__osrfLogAppname);
42         __osrfLogAppname = strdup(appname);
43
44         /* if syslogging, re-open the log with the appname */
45         if( __osrfLogType == OSRF_LOG_TYPE_SYSLOG) {
46                 closelog();
47                 openlog(__osrfLogAppname, 0, __osrfLogFacility);
48         }
49 }
50
51 void osrfLogSetSyslogFacility( int facility ) {
52         __osrfLogFacility = facility;
53 }
54 void osrfLogSetSyslogActFacility( int facility ) {
55         __osrfLogActFacility = facility;
56 }
57
58 void osrfLogSetLevel( int loglevel ) {
59         __osrfLogLevel = loglevel;
60 }
61
62 void osrfLogError( const char* msg, ... ) { OSRF_LOG_GO(msg, OSRF_LOG_ERROR); }
63 void osrfLogWarning( const char* msg, ... ) { OSRF_LOG_GO(msg, OSRF_LOG_WARNING); }
64 void osrfLogInfo( const char* msg, ... ) { OSRF_LOG_GO(msg, OSRF_LOG_INFO); }
65 void osrfLogDebug( const char* msg, ... ) { OSRF_LOG_GO(msg, OSRF_LOG_DEBUG); }
66 void osrfLogInternal( const char* msg, ... ) { OSRF_LOG_GO(msg, OSRF_LOG_INTERNAL); }
67 void osrfLogActivity( const char* msg, ... ) { 
68         OSRF_LOG_GO(msg, OSRF_LOG_ACTIVITY); 
69         /* activity log entries are also logged as info intries */
70         osrfLogDetail( OSRF_LOG_INFO, NULL, -1, NULL, VA_BUF );
71 }
72
73 void osrfLogDetail( int level, char* filename, int line, char* func, char* msg, ... ) {
74         if(!msg) return;
75         VA_LIST_TO_STRING(msg);
76         _osrfLogDetail( level, filename, line, func, VA_BUF );
77 }
78
79 void _osrfLogDetail( int level, char* filename, int line, char* func, char* msg ) {
80
81         if( level == OSRF_LOG_ACTIVITY && ! __osrfLogActivityEnabled ) return;
82         if( level > __osrfLogLevel ) return;
83         if(!msg) return;
84         if(!filename) filename = "";
85         if(!func) func = "";
86
87         char lb[12];
88         bzero(lb,12);
89         if(line >= 0) snprintf(lb,12,"%d", line);
90
91         char* l = "INFO";               /* level name */
92         int lvl = LOG_INFO;     /* syslog level */
93         int fac = __osrfLogFacility;
94
95         switch( level ) {
96                 case OSRF_LOG_ERROR:            
97                         l = "ERR "; 
98                         lvl = LOG_ERR;
99                         break;
100
101                 case OSRF_LOG_WARNING:  
102                         l = "WARN"; 
103                         lvl = LOG_WARNING;
104                         break;
105
106                 case OSRF_LOG_INFO:             
107                         l = "INFO"; 
108                         lvl = LOG_INFO;
109                         break;
110
111                 case OSRF_LOG_DEBUG:    
112                         l = "DEBG"; 
113                         lvl = LOG_DEBUG;
114                         break;
115
116                 case OSRF_LOG_INTERNAL: 
117                         l = "INT "; 
118                         lvl = LOG_DEBUG;
119                         break;
120
121                 case OSRF_LOG_ACTIVITY: 
122                         l = "ACT"; 
123                         lvl = LOG_INFO;
124                         fac = __osrfLogActFacility;
125                         break;
126         }
127
128         if(__osrfLogType == OSRF_LOG_TYPE_SYSLOG )
129                 syslog( fac | lvl, "[%s:%d:%s:%s:%s] %s", l, getpid(), filename, lb, func, msg );
130
131         else if( __osrfLogType == OSRF_LOG_TYPE_FILE )
132                 _osrfLogToFile("[%s:%d:%s:%s:%s] %s", l, getpid(), filename, lb, func, msg );
133
134 }
135
136
137 void _osrfLogToFile( char* msg, ... ) {
138
139         if(!msg) return;
140         if(!__osrfLogFile) return;
141         VA_LIST_TO_STRING(msg);
142
143         if(!__osrfLogAppname) __osrfLogAppname = strdup("osrf");
144         int l = strlen(VA_BUF) + strlen(__osrfLogAppname) + 36;
145         char buf[l];
146         bzero(buf,l);
147
148         char datebuf[36];
149         bzero(datebuf,36);
150         time_t t = time(NULL);
151         struct tm* tms = localtime(&t);
152         strftime(datebuf, 36, "%Y-%m-%d %h:%m:%s", tms);
153
154         FILE* file = fopen(__osrfLogFile, "a");
155         if(!file) {
156                 fprintf(stderr, "Unable to fopen file %s for writing", __osrfLogFile);
157                 return;
158         }
159
160         fprintf(file, "%s %s %s\n", __osrfLogAppname, datebuf, VA_BUF );
161         if( fclose(file) != 0 ) 
162                 osrfLogWarning("Error closing log file: %s", strerror(errno));
163         
164 }
165
166
167 int osrfLogFacilityToInt( char* facility ) {
168         if(!facility) return LOG_LOCAL0;
169         if(strlen(facility) < 6) return LOG_LOCAL0;
170         switch( facility[5] ) {
171                 case '0': return LOG_LOCAL0;
172                 case '1': return LOG_LOCAL1;
173                 case '2': return LOG_LOCAL2;
174                 case '3': return LOG_LOCAL3;
175                 case '4': return LOG_LOCAL4;
176                 case '5': return LOG_LOCAL5;
177                 case '6': return LOG_LOCAL6;
178                 case '7': return LOG_LOCAL7;
179         }
180         return LOG_LOCAL0;
181 }
182
183