--- deliantra/server/common/logger.C 2006/12/30 10:16:10 1.7
+++ deliantra/server/common/logger.C 2007/07/01 05:00:17 1.15
@@ -1,65 +1,61 @@
/*
- CrossFire, A Multiplayer game for X-windows
+ * 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
+ */
- Copyright (C) 2002 Mark Wedel & Crossfire Development Team
- Copyright (C) 1992 Frank Tore Johansen
+#include
+#include
+#include
- 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.
+void
+LOG (int flags, const char *format, ...)
+{
+ int level = flags & 15;
- 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.
+ if (level > settings.debug)
+ return;
- 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.
+ char buf[20480];
- The authors can be reached via e-mail at
-*/
+ struct timeval tv;
+ gettimeofday (&tv, 0);
+ struct tm *ptime = localtime (&tv.tv_sec);
+ int len = strftime (buf, sizeof (buf) - 7, "%Y-%m-%d %H:%M:%S", ptime);
+ len += sprintf (buf + len, ".%04d ", (int)(tv.tv_usec / 100));
-#include
-#include
-#include
+ va_list ap;
+ va_start (ap, format);
+ len += vsnprintf (buf + len, sizeof (buf) - len, format, ap);
+ va_end (ap);
-/*
- * 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.
- */
+ len = min (sizeof (buf) - 1, len);
-void
-LOG (LogLevel logLevel, const char *format, ...)
-{
- if (logLevel <= settings.debug)
- {
- 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];
-
- time_t curtime = time (NULL);
- struct tm *ptime = localtime (&curtime);
-
- strftime (tbuf, 256, "%Y-%m-%d %H:%M:%S ", ptime);
-
- va_list ap;
-
- va_start (ap, format);
-
- vsnprintf (buf, sizeof (buf), format, ap);
- strncat (tbuf, buf, 20460);
- fputs (tbuf, logfile);
- fputs (tbuf, stderr);
+ if (buf [len - 1] != '\n')
+ buf [len++] = '\n'; // not 0-terminated
+
+ write (STDERR_FILENO, buf, len);
+ if (logfile != stderr)
+ fwrite (buf, 1, len, logfile);
- va_end (ap);
- }
+ if (flags & logBacktrace)
+ log_backtrace (buf);
}