00001
00002
00003
00004
00005
00006 int reopen_logfile = 0;
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #include <stdarg.h>
00037 #include <global.h>
00038 #include <sproto.h>
00039
00043 static const char *const loglevel_names[] = {
00044 "[Error] ",
00045 "[Info] ",
00046 "[Debug] ",
00047 "[Monster] "
00048 };
00049
00063 void LOG(LogLevel logLevel, const char *format, ...) {
00064 char buf[20480];
00065
00066
00067
00068
00069 char time_buf[2048];
00070
00071 va_list ap;
00072 va_start(ap, format);
00073
00074 buf[0] = '\0';
00075 if (logLevel <= settings.debug) {
00076 time_buf[0] = '\0';
00077 if (settings.log_timestamp == TRUE) {
00078 struct tm *time_tmp;
00079 time_t now = time((time_t *)NULL);
00080
00081 time_tmp = localtime(&now);
00082 if (time_tmp != NULL) {
00083 if (strftime(time_buf, sizeof(time_buf), settings.log_timestamp_format, time_tmp) == 0) {
00084 time_buf[0] = '\0';
00085 }
00086 }
00087 }
00088
00089 vsnprintf(buf, sizeof(buf), format, ap);
00090 #ifdef WIN32
00091 if (time_buf[0] != 0) {
00092 fputs(time_buf, logfile);
00093 fputs(" ", logfile);
00094 }
00095 fputs(loglevel_names[logLevel], logfile);
00096 fputs(buf, logfile);
00097 #ifdef DEBUG
00098 fflush(logfile);
00099 #endif
00100 if (logfile != stderr) {
00101 fputs(loglevel_names[logLevel], stderr);
00102 fputs(buf, stderr);
00103 if (time_buf[0] != 0) {
00104 fputs(time_buf, stderr);
00105 fputs(" ", stderr);
00106 }
00107 }
00108 #else
00109 if (reopen_logfile) {
00110 reopen_logfile = 0;
00111 if (fclose(logfile) != 0) {
00112
00113
00114 perror("tried to close log file after SIGHUP in logger.c:LOG()");
00115 }
00116 if ((logfile = fopen(settings.logfilename, "a")) == NULL) {
00117
00118
00119 perror("tried to open log file after SIGHUP in logger.c:LOG()");
00120 emergency_save(0);
00121 clean_tmp_files();
00122 exit(1);
00123 }
00124 setvbuf(logfile, NULL, _IOLBF, 0);
00125 LOG(llevInfo, "logfile reopened\n");
00126 }
00127
00128 if (time_buf[0] != 0) {
00129 fputs(time_buf, logfile);
00130 fputs(" ", logfile);
00131 }
00132 fputs(loglevel_names[logLevel], logfile);
00133 fputs(buf, logfile);
00134 #endif
00135 }
00136 if (!exiting
00137 && !trying_emergency_save
00138 && logLevel == llevError
00139 && ++nroferrors > MAX_ERRORS) {
00140 exiting = 1;
00141 if (!trying_emergency_save)
00142 emergency_save(0);
00143 }
00144 va_end(ap);
00145 }