00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021
#ifndef __POSLIB_LOG_H 00022
#define __POSLIB_LOG_H 00023
00024
#include 00025 00026
#include <poslib/postime.h> 00027
#include 00028 00029
#include 00030
#include 00031
#include 00032 00066
#ifdef HAVE_SYSLOG_H 00067
#include 00068
#else 00069
#define LOG_INFO 0 00070
#define LOG_WARNING 1 00071
#define LOG_ERR 2 00072
#define LOG_CRIT 3 00073
#endif 00074
00081 enum log_context { 00082
context_none = 0, 00083
context_threads = 1, 00084
context_socket = 2, 00085
context_server = 3, 00086
context_query = 4, 00087
context_conf = 5, 00088
context_zonedata = 6, 00089
context_system = 7, 00090 }; 00091
00097 enum log_severity { 00098
log_info = LOG_INFO, 00099
log_warning = LOG_WARNING, 00100
log_error = LOG_ERR, 00101
log_panic = LOG_CRIT, 00102 }; 00103 00104 00105
#if defined(_WIN32) && !defined(BUILD_POSD_DLL) 00106
extern __declspec(dllimport) const
char log_contexts[][16]; 00107 #else
00110 extern const
char log_contexts[][16]; 00111 #endif 00112 00113 #if defined(_WIN32) && !defined(BUILD_POSD_DLL) 00114 extern __declspec(dllimport)
void (*pos_log)(log_context context, log_severity severity, 00115
char *log_fmt, ...); 00116 #else
00125 extern
void (*pos_log)(log_context context, log_severity severity, 00126
char *log_fmt, ...); 00127 #endif 00128 00129 #ifdef POS_DEFAULTLOG 00130 00131 #ifdef POS_DEFAULTLOG_FILE 00132 FILE *outfile = NULL; 00133 #endif 00134 00135
void l_pos_log(log_context context, log_severity severity, 00136
char *log_fmt, ...); 00137 00138 class __static_log_initializer { 00139
public: 00140 __static_log_initializer() { 00141
pos_log = l_pos_log; 00142
#if defined(POS_DEFAULTLOG_SYSLOG) && defined(HAVE_SYSLOG_H) 00143
openlog(
"posadis", LOG_PID, LOG_DAEMON); 00144
#endif 00145
} 00146 ~__static_log_initializer() { 00147
#if defined(POS_DEFAULTLOG_SYSLOG) && defined(HAVE_SYSLOG_H) 00148
closelog(); 00149
#endif 00150
#ifdef POS_DEFAULTLOG_FILE 00151
if (
outfile) fclose(
outfile); 00152
#endif 00153
} 00154 } ___static_log_intializer; 00155 00156
#ifdef POS_DEFAULTLOG_FPTR 00157
void(*pos_log_fptr)(
log_context context,
log_severity severity,
char *message) = NULL; 00158
#endif 00159
00160
#ifdef POS_DEFAULTLOG_STDERR 00161
00167
bool do_stderr_log =
true; 00168
#endif 00169
00170
void l_pos_log(log_context context, log_severity severity, 00171
char *log_fmt, ...) { 00172
char buff[4096]; 00173
struct tm *tstruct; 00174 va_list args; 00175 time_t tsecs; 00176
int pos; 00177 00178 tsecs = time(NULL); 00179 tstruct = localtime(&tsecs); 00180 sprintf(buff,
"%04d/%02d/%02d %02d:%02d:%02d|", tstruct->tm_year + 1900, tstruct->tm_mon + 1, tstruct->tm_mday, tstruct->tm_hour, tstruct->tm_min, tstruct->tm_sec); 00181
switch (severity) { 00182
case log_info: strcat(buff,
"info: ");
break; 00183
case log_warning: strcat(buff,
"warning: ");
break; 00184
case log_error: strcat(buff,
"error: ");
break; 00185
case log_panic: strcat(buff,
"panic: ");
break; 00186 } 00187 00188
if (context !=
context_none) { 00189 strcat(buff,
"["); 00190 strcat(buff, log_contexts[context]); 00191 strcat(buff,
"] "); 00192 } 00193 00194 pos = strlen(buff); 00195 va_start(args, log_fmt); 00196 vsnprintf(&buff[strlen(buff)],
sizeof(buff) - strlen(buff) - 1, log_fmt, args); 00197 va_end(args); 00198 00199
#ifdef POS_DEFAULTLOG_FILE 00200
if (
outfile) fprintf(outfile,
"%s\n", buff); 00201
#ifndef POS_DEFAULTLOG_FILE_NOFLUSH 00202
fflush(outfile); 00203
#endif 00204
#endif 00205
#ifdef POS_DEFAULTLOG_STDERR 00206
if (
do_stderr_log) fprintf(stderr,
"%s\n", buff); 00207
#endif 00208
#if defined(POS_DEFAULTLOG_SYSLOG) && defined(HAVE_SYSLOG_H) 00209
syslog(severity,
"%s", strchr(buff,
'|') + 1); 00210
#endif 00211
#ifdef POS_DEFAULTLOG_FPTR 00212
if (
pos_log_fptr)
pos_log_fptr(context, severity, buff + pos); 00213
#endif 00214
} 00215 00216
#else 00217
00227 extern FILE *
outfile;
00237 extern void(*pos_log_fptr)(
log_context context,
log_severity severity,
char *message);
00247 extern bool do_stderr_log; 00248
#endif 00249
00250
#endif