]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/utils/logging.c
53105b08a66851afb195ea2facc3411d9c4e139e
[OpenSRF.git] / src / utils / logging.c
1 #include <stdio.h>
2 #include "logging.h"
3
4
5 void get_timestamp( char buf_36chars[]) {
6
7         struct timeb tb;
8         ftime(&tb);
9         char* localtime = strdup( ctime( &(tb.time) ) );
10         char mil[4];
11         memset(mil,0,4);
12         sprintf(mil," (%d)",tb.millitm);
13         strcpy( buf_36chars, localtime );
14         buf_36chars[ strlen(localtime)-1] = '\0'; // remove newline
15         strcat(buf_36chars,mil);
16         free(localtime);
17 }
18
19 static char* lf = NULL;
20 static int log_level = -1;
21 static int logging = 0;
22
23 void log_free() { if( lf != NULL ) free(lf); }
24
25 int fatal_handler( char* msg, ... ) {
26
27         FILE * log_file;
28
29         char buf[36];
30         memset( buf, 0, 36 );
31         get_timestamp( buf );
32         pid_t  pid = getpid();
33         va_list args;
34
35         if( logging ) {
36                 if( log_level < LOG_ERROR )
37                         return -1;
38
39                 log_file = fopen( lf, "a" );
40                 if( log_file == NULL ) {
41                         perror( "Unable to open log file for appending\n" );
42                 } else {
43
44                         fprintf( log_file, "[%s %d] [%s] ", buf, pid, "ERR " );
45         
46                         va_start(args, msg);
47                         vfprintf(log_file, msg, args);
48                         va_end(args);
49         
50                         fprintf(log_file, "\n");
51                         fflush( log_file );
52
53                         fclose(log_file);
54                 }
55         }
56         
57         /* also log to stderr  for ERRORS*/
58         fprintf( stderr, "[%s %d] [%s] ", buf, pid, "ERR " );
59         va_start(args, msg);
60         vfprintf(stderr, msg, args);
61         va_end(args);
62         fprintf( stderr, "\n" );
63
64         exit(99);
65         return -1; /* for consistency */
66 }
67
68 int warning_handler( char* msg, ... ) {
69
70         FILE * log_file;
71
72         char buf[36];
73         memset( buf, 0, 36 );
74         get_timestamp( buf );
75         pid_t  pid = getpid();
76         va_list args;
77         
78         if( log_level < LOG_WARNING )
79                 return -1;
80
81         if(logging) {
82
83                 log_file = fopen( lf, "a" );
84                 if( log_file == NULL ) {
85                         perror( "Unable to open log file for appending\n" );
86                         fprintf( stderr, "[%s %d] [%s] ", buf, pid, "WARN" );
87                         va_start(args, msg);
88                         vfprintf(stderr, msg, args);
89                         va_end(args);
90                         fprintf( stderr, "\n" );
91                 } else {
92
93                         fprintf( log_file, "[%s %d] [%s] ", buf, pid, "WARN" );
94         
95                         va_start(args, msg);
96                         vfprintf(log_file, msg, args);
97                         va_end(args);
98         
99                         fprintf(log_file, "\n");
100                         fflush( log_file );
101
102                         fclose(log_file);
103                 }
104         } else {
105
106                 fprintf( stderr, "[%s %d] [%s] ", buf, pid, "WARN" );
107                 va_start(args, msg);
108                 vfprintf(stderr, msg, args);
109                 va_end(args);
110                 fprintf( stderr, "\n" );
111         }
112
113         return -1;
114 }
115
116 int info_handler( char* msg, ... ) {
117
118         FILE * log_file;
119
120         char buf[36];
121         memset( buf, 0, 36 );
122         get_timestamp( buf );
123         pid_t  pid = getpid();
124         va_list args;
125
126         if( log_level < LOG_INFO )
127                 return -1;
128
129         if(logging) {
130
131                 log_file = fopen( lf, "a" );
132                 if( log_file == NULL ) {
133                         perror( "Unable to open log file for appending\n" );
134                         fprintf( stderr, "[%s %d] [%s] ", buf, pid, "INFO" );
135                         va_start(args, msg);
136                         vfprintf(stderr, msg, args);
137                         va_end(args);
138                         fprintf( stderr, "\n" );
139                         fflush(stderr);
140                 } else {
141
142                         fprintf( log_file, "[%s %d] [%s] ", buf, pid, "INFO" );
143
144                         va_start(args, msg);
145                         vfprintf(log_file, msg, args);
146                         va_end(args);
147         
148                         fprintf(log_file, "\n");
149                         fflush( log_file );
150                         fclose(log_file);
151                 }
152         } else {
153
154                 fprintf( stderr, "[%s %d] [%s] ", buf, pid, "INFO" );
155                 va_start(args, msg);
156                 vfprintf(stderr, msg, args);
157                 va_end(args);
158                 fprintf( stderr, "\n" );
159                 fflush(stderr);
160
161         }
162         return -1;
163 }
164
165
166 int debug_handler( char* msg, ... ) {
167
168         FILE * log_file;
169
170         char buf[36];
171         memset( buf, 0, 36 );
172         get_timestamp( buf );
173         pid_t  pid = getpid();
174         va_list args;
175         
176         if( log_level < LOG_DEBUG )
177                 return -1;
178
179         if(logging) {
180
181                 log_file = fopen( lf, "a" );
182                 if( log_file == NULL ) {
183                         perror( "Unable to open log file for appending\n" );
184                         fprintf( stderr, "[%s %d] [%s] ", buf, pid, "DEBG" );
185                         va_start(args, msg);
186                         vfprintf(stderr, msg, args);
187                         va_end(args);
188                         fprintf( stderr, "\n" );
189                 } else {
190                         fprintf( log_file, "[%s %d] [%s] ", buf, pid, "DEBG" );
191         
192                         va_start(args, msg);
193                         vfprintf(log_file, msg, args);
194                         va_end(args);
195         
196                         fprintf(log_file, "\n");
197                         fflush( log_file );
198                 
199                         fclose(log_file);
200                 }
201         } else {
202
203                 fprintf( stderr, "[%s %d] [%s] ", buf, pid, "DEBG" );
204                 va_start(args, msg);
205                 vfprintf(stderr, msg, args);
206                 va_end(args);
207                 fprintf( stderr, "\n" );
208         }
209
210         return -1;
211 }
212
213
214 int log_init( int llevel, char* lfile ) {
215
216
217         if( llevel < 1 ) {
218                 logging = 0;
219                 return 0;
220         }
221
222         /* log to stderr */
223         if(lfile == NULL) return 0;
224
225         log_level = llevel;
226         lf = strdup(lfile);
227
228         logging = 1;
229         return 1;
230
231 }
232
233