--- deliantra/server/common/logger.C 2006/09/10 16:00:23 1.4
+++ deliantra/server/common/logger.C 2007/07/01 05:00:17 1.15
@@ -1,85 +1,61 @@
-
/*
- * static char *rcsid_loger_c =
- * "$Id: logger.C,v 1.4 2006/09/10 16:00:23 root Exp $ ";
+ * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
+ *
+ * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
+ * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
+ * Copyright (©) 1992,2007 Frank Tore Johansen
+ *
+ * Crossfire TRT is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * The authors can be reached via e-mail to
*/
-/*
- CrossFire, A Multiplayer game for X-windows
-
- Copyright (C) 2002 Mark Wedel & Crossfire Development Team
- Copyright (C) 1992 Frank Tore Johansen
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- The authors can be reached via e-mail at crossfire-devel@real-time.com
-*/
-
-
-#include
+#include
#include
#include
-/*
- * Logs a message to stderr, or to file, and/or even to socket.
- * Or discards the message if it is of no importanse, and none have
- * asked to hear messages of that logLevel.
- *
- * See include/logger.h for possible logLevels. Messages with llevInfo
- * and llevError are always printed, regardless of debug mode.
- */
-
void
-LOG (LogLevel logLevel, const char *format, ...)
+LOG (int flags, const char *format, ...)
{
- char buf[20480]; /* This needs to be really really big - larger
- * than any other buffer, since that buffer may
- * need to be put in this one.
- */
- char tbuf[20480];
+ int level = flags & 15;
- time_t curtime = time (NULL);
- struct tm *ptime = localtime (&curtime);
+ if (level > settings.debug)
+ return;
- strftime (tbuf, 256, "%Y-%m-%d %H:%M:%S ", ptime);
+ char buf[20480];
- va_list ap;
+ struct timeval tv;
+ gettimeofday (&tv, 0);
+ struct tm *ptime = localtime (&tv.tv_sec);
- va_start (ap, format);
+ int len = strftime (buf, sizeof (buf) - 7, "%Y-%m-%d %H:%M:%S", ptime);
+ len += sprintf (buf + len, ".%04d ", (int)(tv.tv_usec / 100));
- buf[0] = '\0';
- if (logLevel <= settings.debug)
- {
- vsnprintf (buf, sizeof (buf), format, ap);
- strncat (tbuf, buf, 20460);
-#ifdef WIN32 /* ---win32 change log handling for win32 */
- fputs (tbuf, logfile); /* wrote to file or stdout */
-# ifdef DEBUG /* if we have a debug version, we want see ALL output */
- fflush (logfile); /* so flush this! */
-# endif
- if (logfile != stderr) /* if was it a logfile wrote it to screen too */
- fputs (tbuf, stderr);
-#else
- fputs (tbuf, logfile);
-#endif
- }
- if (!exiting && !trying_emergency_save && logLevel == llevError && ++nroferrors > MAX_ERRORS)
- {
- exiting = 1;
- if (!trying_emergency_save)
- emergency_save (0);
- }
+ va_list ap;
+ va_start (ap, format);
+ len += vsnprintf (buf + len, sizeof (buf) - len, format, ap);
va_end (ap);
+
+ len = min (sizeof (buf) - 1, len);
+
+ if (buf [len - 1] != '\n')
+ buf [len++] = '\n'; // not 0-terminated
+
+ write (STDERR_FILENO, buf, len);
+ if (logfile != stderr)
+ fwrite (buf, 1, len, logfile);
+
+ if (flags & logBacktrace)
+ log_backtrace (buf);
}