[libvirt] [PATCH 1/2] logging: Do not log timestamp through syslog

Daniel Veillard veillard at redhat.com
Thu Sep 29 08:10:39 UTC 2011


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 at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list