#include #include #include #include #include #include #include #include FILE *logfile = NULL; int loglevel; #define LOG_FATAL 0 #define LOG_WARN 1 #define LOG_INFO 2 #define LOG_DEBUG 3 static void logit(int, const char *, va_list); void log_init(int level, int logstdout) { char name[128]; if (logstdout == 1) { logfile = stderr; } else { snprintf(name, sizeof(name), "pg.log"); logfile = fopen(name, "a+"); if (!logfile) { printf("cannot open log file %s!\n", name); exit(1); } } loglevel = level; } void log_tmp(const char *msg, ...) { va_list ap; va_start(ap, msg); vfprintf(logfile, msg, ap); fprintf(logfile, "\n"); fflush(logfile); va_end(ap); } void log_debug(const char *msg, ...) { va_list ap; va_start(ap, msg); logit(LOG_DEBUG, msg, ap); va_end(ap); } void log_info(const char *msg, ...) { va_list ap; va_start(ap, msg); logit(LOG_INFO, msg, ap); va_end(ap); } void log_warn(const char *msg, ...) { va_list ap; va_start(ap, msg); logit(LOG_WARN, msg, ap); va_end(ap); } void fatal(const char *msg, ...) { va_list ap; va_start(ap, msg); logit(LOG_FATAL, msg, ap); va_end(ap); exit(1); } static void logit(int level, const char *msg, va_list ap) { time_t clock; char type; if (level <= loglevel) { switch (level) { case LOG_FATAL: type='X'; break; case LOG_WARN: type='W'; break; case LOG_INFO: type='.'; break; case LOG_DEBUG: type=' '; break; } time(&clock); fprintf(logfile, "%d %c ", (int)clock, type); vfprintf(logfile, msg, ap); fprintf(logfile, "\n"); fflush(logfile); } }