[syslog-ng] Multi-line Logs
Enigma
enigma at security-fu.com
Thu Jul 3 11:56:28 CEST 2008
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?
More information about the syslog-ng
mailing list