00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00031
00032 #ifdef HAVE_CONFIG_H
00033 #include "autoconfig.h"
00034 #endif
00035
00036 #include <stdio.h>
00037 #include <errno.h>
00038 #include <string.h>
00039 #include <stdlib.h>
00040 #include <stdarg.h>
00041 #include <time.h>
00042
00043 #ifdef HAVE_EXECINFO_H
00044 #include <execinfo.h>
00045 #endif
00046
00047 #include "logger.h"
00048 #include "config_manager.h"
00049
00050 FILE *LOG_FILE = stderr;
00051
00052 #define FLUSHIT fflush(LOG_FILE);
00053
00054 #define LOGCHECK if (!LOG_FILE) return;
00055
00056 void log_open(char *filename)
00057 {
00058 LOG_FILE = fopen(filename, "a");
00059 if (! LOG_FILE)
00060 {
00061 fprintf(stderr, "Could not open log file %s : %s\n",
00062 filename, strerror(errno));
00063 exit(1);
00064 }
00065 }
00066 void log_close()
00067 {
00068 if (LOG_FILE)
00069 {
00070 fclose(LOG_FILE);
00071 LOG_FILE = NULL;
00072 }
00073 }
00074
00075 static void log_stamp(const char *type)
00076 {
00077 time_t unx;
00078 struct tm t;
00079 time(&unx);
00080 localtime_r(&unx, &t);
00081 fprintf(LOG_FILE, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d %*s: ",
00082 t.tm_year + 1900,
00083 t.tm_mon + 1,
00084 t.tm_mday,
00085 t.tm_hour,
00086 t.tm_min,
00087 t.tm_sec,
00088 7,
00089 type);
00090 }
00091
00092 void _log_info(const char *format, ...)
00093 {
00094 va_list ap;
00095 LOGCHECK
00096 va_start(ap, format);
00097 log_stamp("INFO");
00098 vfprintf(LOG_FILE, format, ap);
00099 FLUSHIT
00100 va_end(ap);
00101 }
00102 void _log_warning(const char *format, ...)
00103 {
00104 va_list ap;
00105 LOGCHECK
00106 va_start(ap, format);
00107 log_stamp("WARNING");
00108 vfprintf(LOG_FILE, format, ap);
00109 FLUSHIT
00110 va_end(ap);
00111 }
00112 void _log_error(const char *format, ...)
00113 {
00114 va_list ap;
00115 LOGCHECK
00116 va_start(ap, format);
00117 log_stamp("ERROR");
00118 vfprintf(LOG_FILE, format, ap);
00119 FLUSHIT
00120 va_end(ap);
00121 }
00122 void _log_js(const char *format, ...)
00123 {
00124 va_list ap;
00125 LOGCHECK
00126 va_start(ap, format);
00127 log_stamp("JS");
00128 vfprintf(LOG_FILE, format, ap);
00129 FLUSHIT
00130 va_end(ap);
00131 }
00132 void _log_debug(const char *format, const char *file, int line, const char *function, ...)
00133 {
00134 bool enabled;
00135 #ifdef TOMBDEBUG
00136 enabled = !ConfigManager::isDebugLogging();
00137 #else
00138 enabled = ConfigManager::isDebugLogging();
00139 #endif
00140 if (enabled)
00141 {
00142 va_list ap;
00143 LOGCHECK
00144 va_start(ap, function);
00145 log_stamp("DEBUG");
00146 fprintf(LOG_FILE, "[%s:%d] %s(): ", file, line, function);
00147 vfprintf(LOG_FILE, format, ap);
00148 FLUSHIT
00149 va_end(ap);
00150 }
00151 }
00152
00153 void _print_backtrace(FILE* file)
00154 {
00155 #if defined HAVE_BACKTRACE && defined HAVE_BACKTRACE_SYMBOLS
00156
00157 bool enabled;
00158 #ifdef TOMBDEBUG
00159 enabled = !ConfigManager::isDebugLogging();
00160 #else
00161 enabled = ConfigManager::isDebugLogging();
00162 #endif
00163 if (enabled)
00164 {
00165 void* b[100];
00166 int size = backtrace(b, 100);
00167 char **s = backtrace_symbols(b, size);
00168 for(int i = 0; i < size; i++)
00169 fprintf(file, "_STRACE_ %i %s\n", i, s[i]);
00170 free(s);
00171 }
00172
00173 #endif
00174 }