
On Thu, Sep 29, 2011 at 08:58:08AM +0100, Daniel P. Berrange wrote:
On Thu, Sep 29, 2011 at 09:05:59AM +0800, Daniel Veillard wrote:
On Wed, Sep 28, 2011 at 04:46:11PM +0200, Jiri Denemark wrote:
Syslog puts the timestamp to every message anyway so this removes redundant data. --- src/util/logging.c | 121 +++++++++++++++++++++++++++++++-------------------- src/util/logging.h | 9 ++-- 2 files changed, 78 insertions(+), 52 deletions(-)
diff --git a/src/util/logging.c b/src/util/logging.c index a638510..4ffaf75 100644 --- a/src/util/logging.c +++ b/src/util/logging.c @@ -98,7 +98,8 @@ static int virLogResetFilters(void); static int virLogResetOutputs(void); static int virLogOutputToFd(const char *category, int priority, const char *funcname, long long linenr, - const char *str, int len, void *data); + const char *timestamp, const char *str, + void *data);
/* * Logs accesses must be serialized though a mutex @@ -282,16 +283,16 @@ void virLogShutdown(void) { /* * Store a string in the ring buffer */ -static void virLogStr(const char *str, int len) { +static void virLogStr(const char *str) +{ int tmp; + int len;
if ((str == NULL) || (virLogBuffer == NULL) || (virLogSize <= 0)) return; - if (len <= 0) - len = strlen(str); + len = strlen(str); if (len >= virLogSize) return; - virLogLock();
/* * copy the data and reset the end, we cycle over the end of the buffer @@ -317,7 +318,6 @@ static void virLogStr(const char *str, int len) { if (virLogStart >= virLogSize) virLogStart -= virLogSize; } - virLogUnlock(); }
static void virLogDumpAllFD(const char *msg, int len) { @@ -618,12 +618,28 @@ cleanup: return ret; }
+static char * +virLogFormatTimestamp(void) +{ + struct timeval cur_time; + struct tm time_info; + char *str = NULL; + + gettimeofday(&cur_time, NULL); + localtime_r(&cur_time.tv_sec, &time_info); + + if (virAsprintf(&str, "%02d:%02d:%02d.%03d", + time_info.tm_hour, time_info.tm_min, time_info.tm_sec, + (int) (cur_time.tv_usec / 1000)) < 0) + return NULL; + + return str; +} + static int virLogFormatString(char **msg, const char *funcname, long long linenr, - struct tm *time_info, - struct timeval *cur_time, int priority, const char *str) { @@ -637,25 +653,19 @@ virLogFormatString(char **msg, * to just grep for it to find the right place. */ if ((funcname != NULL)) { - ret = virAsprintf(msg, "%02d:%02d:%02d.%03d: %d: %s : %s:%lld : %s\n", - time_info->tm_hour, time_info->tm_min, - time_info->tm_sec, (int) cur_time->tv_usec / 1000, - virThreadSelfID(), - virLogPriorityString(priority), funcname, linenr, str); + ret = virAsprintf(msg, "%d: %s : %s:%lld : %s\n", + virThreadSelfID(), virLogPriorityString(priority), + funcname, linenr, str); } else { - ret = virAsprintf(msg, "%02d:%02d:%02d.%03d: %d: %s : %s\n", - time_info->tm_hour, time_info->tm_min, - time_info->tm_sec, (int) cur_time->tv_usec / 1000, - virThreadSelfID(), - virLogPriorityString(priority), str); + ret = virAsprintf(msg, "%d: %s : %s\n", + virThreadSelfID(), virLogPriorityString(priority), + str); } return ret; }
static int -virLogVersionString(char **msg, - struct tm *time_info, - struct timeval *cur_time) +virLogVersionString(char **msg) { #ifdef PACKAGER_VERSION # ifdef PACKAGER @@ -670,9 +680,7 @@ virLogVersionString(char **msg, "libvirt version: " VERSION #endif
- return virLogFormatString(msg, NULL, 0, - time_info, cur_time, - VIR_LOG_INFO, LOG_VERSION_STRING); + return virLogFormatString(msg, NULL, 0, VIR_LOG_INFO, LOG_VERSION_STRING); }
/** @@ -694,9 +702,8 @@ void virLogMessage(const char *category, int priority, const char *funcname, static bool logVersionStderr = true; char *str = NULL; char *msg = NULL; - struct timeval cur_time; - struct tm time_info; - int len, fprio, i, ret; + char *timestamp = NULL; + int fprio, i, ret; int saved_errno = errno; int emit = 1; va_list ap; @@ -730,16 +737,15 @@ void virLogMessage(const char *category, int priority, const char *funcname, goto cleanup; } va_end(ap); - gettimeofday(&cur_time, NULL); - localtime_r(&cur_time.tv_sec, &time_info);
- ret = virLogFormatString(&msg, funcname, linenr, - &time_info, &cur_time, - priority, str); + ret = virLogFormatString(&msg, funcname, linenr, priority, str); VIR_FREE(str); if (ret < 0) goto cleanup;
+ if (!(timestamp = virLogFormatTimestamp())) + goto cleanup; + /* * Log based on defaults, first store in the history buffer, * then if emit push the message on the outputs defined, if none @@ -748,42 +754,49 @@ void virLogMessage(const char *category, int priority, const char *funcname, * threads, but avoid intermixing. Maybe set up locks per output * to improve paralellism. */ - len = strlen(msg); - virLogStr(msg, len); + virLogLock(); + virLogStr(timestamp); + virLogStr(msg); + virLogUnlock();
Hum, I'm not sure I like that, I think virLogStr ends up doing a synchronous write, and if that's the case we are doing 2 costly operations instead of one. I really prefer we merge the strings in memory before calling virLogStr()
I think you might be mixing up virLogStr() with a different method. virLogStr() merely memcpy()'s the data into the ring buffer.
Ah right, my bad, objection removed ! Worse is that I wrote that routine mostly, I will blame the old age :-) It's virLogMessage() which (eventually) ends up writing to the log outputs... Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/