X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Flog.c;h=61a92d24994109f34c06f23a1b165a9440ebc096;hb=bb5f5ae82bdcb7b5189032940d0b609dc12be70b;hp=0564dd3350859fb386420e6d3d2cd8238541667d;hpb=4c431fe65269e9b1d452855b9df8cfe80683b691;p=umurmur.git diff --git a/src/log.c b/src/log.c index 0564dd3..61a92d2 100644 --- a/src/log.c +++ b/src/log.c @@ -1,5 +1,5 @@ -/* Copyright (C) 2009-2012, Martin Johansson - Copyright (C) 2005-2012, Thorvald Natvig +/* Copyright (C) 2009-2014, Martin Johansson + Copyright (C) 2005-2014, Thorvald Natvig All rights reserved. @@ -39,6 +39,7 @@ #include "log.h" #include "conf.h" +#include "util.h" #define STRSIZE 254 @@ -56,7 +57,7 @@ static void openlogfile(const char *logfilename) /* Set the stream as line buffered */ if (setvbuf(logfile, NULL, _IOLBF, 0) < 0) Log_fatal("setvbuf() failed: %s\n", strerror(errno)); - + /* XXX - Is it neccessary/appropriate that logging to file is non-blocking? * If not, there's a risk that execution blocks, meaning that voice blocks * as well since uMurmur is single threaded by design. OTOH, what could @@ -69,14 +70,26 @@ static void openlogfile(const char *logfilename) fcntl(fd, F_SETFL, flags | O_NONBLOCK); } +static char *timestring(void) +{ + static char timebuf[32]; + time_t t; + struct tm *timespec; + + t= time(NULL); + timespec = localtime(&t); + strftime(timebuf, 32, "%b %e %T", timespec); + return timebuf; +} + void Log_init(bool_t terminal) { const char *logfilename; - - termprint = terminal; + + termprint = terminal; if (termprint) return; - + logfilename = getStrConf(LOGFILE); if (logfilename != NULL) { openlogfile(logfilename); @@ -91,14 +104,14 @@ void Log_free() return; else if (logfile) fclose(logfile); - else + else closelog(); } - + void Log_reset() { const char *logfilename; - + if (logfile) { logfilename = getStrConf(LOGFILE); fclose(logfile); @@ -110,14 +123,15 @@ void logthis(const char *logstring, ...) { va_list argp; char buf[STRSIZE + 1]; - + va_start(argp, logstring); vsnprintf(&buf[0], STRSIZE, logstring, argp); va_end(argp); + if (termprint) fprintf(stderr, "%s\n", buf); else if (logfile) - fprintf(logfile, "%s\n", buf); + fprintf(logfile, "%s %s\n", timestring(), buf); else syslog(LOG_INFO, "%s", buf); } @@ -127,15 +141,18 @@ void Log_warn(const char *logstring, ...) va_list argp; char buf[STRSIZE + 1]; int offset = 0; - + + if (termprint || logfile) + offset = sprintf(buf, "WARN: "); + va_start(argp, logstring); - offset = sprintf(buf, "WARN: "); vsnprintf(&buf[offset], STRSIZE - offset, logstring, argp); va_end(argp); + if (termprint) fprintf(stderr, "%s\n", buf); else if (logfile) - fprintf(logfile, "%s\n", buf); + fprintf(logfile, "%s %s\n", timestring(), buf); else syslog(LOG_WARNING, "%s", buf); } @@ -145,15 +162,18 @@ void Log_info(const char *logstring, ...) va_list argp; char buf[STRSIZE + 1]; int offset = 0; - + + if (termprint || logfile) + offset = sprintf(buf, "INFO: "); + va_start(argp, logstring); - offset = sprintf(buf, "INFO: "); vsnprintf(&buf[offset], STRSIZE - offset, logstring, argp); va_end(argp); + if (termprint) fprintf(stderr, "%s\n", buf); else if (logfile) - fprintf(logfile, "%s\n", buf); + fprintf(logfile, "%s %s\n", timestring(), buf); else syslog(LOG_INFO, "%s", buf); } @@ -163,20 +183,24 @@ void Log_info_client(client_t *client, const char *logstring, ...) va_list argp; char buf[STRSIZE + 1]; int offset = 0; - + + if (termprint || logfile) + offset = sprintf(buf, "INFO: "); + va_start(argp, logstring); - offset = sprintf(buf, "INFO: "); offset += vsnprintf(&buf[offset], STRSIZE - offset, logstring, argp); va_end(argp); + offset += snprintf(&buf[offset], STRSIZE - offset, " - [%d] %s@%s:%d", - client->sessionId, - client->username == NULL ? "" : client->username, - inet_ntoa(client->remote_tcp.sin_addr), - ntohs(client->remote_tcp.sin_port)); + client->sessionId, + client->username == NULL ? "" : client->username, + Util_clientAddressToString(client), + Util_clientAddressToPortTCP(client)); + if (termprint) fprintf(stderr, "%s\n", buf); else if (logfile) - fprintf(logfile, "%s\n", buf); + fprintf(logfile, "%s %s\n", timestring(), buf); else syslog(LOG_INFO, "%s", buf); } @@ -187,15 +211,17 @@ void Log_debug(const char *logstring, ...) va_list argp; char buf[STRSIZE + 1]; int offset = 0; - + + if (termprint || logfile) + offset = sprintf(buf, "DEBUG: "); + va_start(argp, logstring); - offset = sprintf(buf, "DEBUG: "); vsnprintf(&buf[offset], STRSIZE - offset, logstring, argp); va_end(argp); if (termprint) fprintf(stderr, "%s\n", buf); else if (logfile) - fprintf(logfile, "%s\n", buf); + fprintf(logfile, "%s %s\n", timestring(), buf); else syslog(LOG_DEBUG, "%s", buf); } @@ -206,16 +232,20 @@ void Log_fatal(const char *logstring, ...) va_list argp; char buf[STRSIZE + 1]; int offset = 0; + + if (termprint || logfile) + offset = sprintf(buf, "FATAL: "); + va_start(argp, logstring); - offset = sprintf(buf, "FATAL: "); vsnprintf(&buf[offset], STRSIZE - offset, logstring, argp); va_end(argp); + if (termprint) fprintf(stderr, "%s\n", buf); else if (logfile) - fprintf(logfile, "%s\n", buf); + fprintf(logfile, "%s %s\n", timestring(), buf); else { /* If logging subsystem is not initialized, fall back to stderr + - * syslog logging for fatal errors. + * syslog logging for fatal errors. */ if (!init) { openlog("uMurmurd", LOG_PID, LOG_DAEMON); @@ -223,6 +253,6 @@ void Log_fatal(const char *logstring, ...) } syslog(LOG_CRIT, "%s", buf); } - + exit(1); }