[syslog-ng] Multi-line Logs

Balazs Scheidler bazsi at balabit.hu
Thu Jul 3 16:05:34 CEST 2008


On Thu, 2008-07-03 at 05:56 -0400, Enigma wrote:
> Balazs Scheidler wrote:
> > On Thu, 2008-07-03 at 11:17 +0200, Balazs Scheidler wrote:
> >   
> >> On Wed, 2008-07-02 at 18:31 -0400, Enigma wrote:
> >>     
> >>> I have a host that sends mult-line messages (embedded newlines, not 
> >>> separate syslog messages) from what I can tell syslog-ng strips out all 
> >>> the newlines and replaces them with a space.
> >>>
> >>> Is there anyway to disable or modify (replace them with something else 
> >>> that can be easily s/// in post-processing) this functionality without 
> >>> changing the code and compiling from source?
> >>>
> >>> I have been through the syslog-ng manual and asked Mr. Google and I 
> >>> cannot find anything on this topic.
> >>>       
> >> Newlines and stuff are incompatible with TCP transport. If you are using
> >> UDP, it could work, however as you point out syslog-ng removes all NLs
> >> from log messages in order not to ruin your logfiles.
> >>
> >> With my development snapshot the new syslog-protocol drafts are
> >> implemented, that too allows embedded NLs.
> >>
> >> This crude patch deletes the part that removes NLs from messages:
> >>
> >> diff --git a/src/logmsg.c b/src/logmsg.c
> >> index 139fb3a..adb9f2d 100644
> >> --- a/src/logmsg.c
> >> +++ b/src/logmsg.c
> >> @@ -522,11 +522,6 @@ log_msg_parse(LogMessage *self, gchar *data, gint length, guint flags, regex_t *
> >>        self->stamp.time.tv_sec = now;
> >>      }
> >>  
> >> -  for (oldsrc = src, oldleft = left; oldleft >= 0; oldleft--, oldsrc++)
> >> -    {
> >> -      if (*oldsrc == '\n' || *oldsrc == '\r')
> >> -       *oldsrc = ' ';
> >> -    }
> >>    g_string_assign_len(&self->msg, src, left);
> >>  }
> >>  
> >>
> >> I might add something more sophisticated if you or anyone else can help me with finding out a 
> >> good idea how to handle NLs when they are written to logfiles.
> >>
> >> E.g. you have a template like this:
> >>
> >> template("$DATE $HOST $MSG\n");
> >>
> >> If there's an NL in $MSG it'd probably break a lot of log parsers. If syslog-ng would repeat the syslog header
> >>
> >>     
> >
> > sorry, sent too early. Would it be enough if syslog-ng would be capable
> > of repeating the $DATE $HOST part for each line produced because of NLs
> > in MSG?
> >
> > How do you want to use multi-line messages?
> >
> >   
> Basically I want to preserve the logs as they come from the source.  
> They are delivered to syslog-ng (via UDP so the TCP issue isn't a 
> factor) with embedded newlines and we need them to be forwarded (again 
> via UDP) and written to the log files with those embedded newlines.  
> This is kind of a corner case because we know it will not affect any log 
> parsing.  Unfortunately patching the code will not work since this 
> syslog-ng server resides on client prem and will not patch/compile from 
> source on a production machine.
> 
> The only other option would be to replace the newlines with some other 
> char (with a regex) that we can so a substitute with a newline on the 
> backend before writing to the log file or forwarding the message.  I 
> haven't been able to find this functionality either (quite possibly a 
> PEBCAK situation).  Is this the rewrite stuff you were talking about in 
> your 'migrate over to PCRE' thread?

The first problem that I'd have to disable the "substitute every NL with
a space" code in the input path, and probably put that into the
destination, controlled by a flag or something.

This way you can either have NL in your destination if you choose to, or
you can also rewrite it using regexps.

-- 
Bazsi



More information about the syslog-ng mailing list