[syslog-ng] are nested quotes possible in parser

Michael Hocke michael.hocke at nyu.edu
Tue Jan 13 17:10:46 CET 2009


Hi there,

my Avocent console servers are sending console port output via syslog  
to my syslog server running syslog-ng 3.0.1. Console output looks  
like this:

Jan 13 00:18:39 sysl at cyc2 Buffering: S39.gwa [Jan 13 00:14:04.379: % 
EARL_NETFLOW-SP-4-TCAM_THRLD: Netflow TCAM threshold exceeded, TCAM  
Utilization [97%]]
Jan 13 00:18:53 sysl at cyc2 Buffering: S42.sw2f [2009 Jan 13 00:18:53  
EST -05:00 %ETHC-5-PORTTOSTP:Port 3/27 joined bridge port 3/27]
Jan 13 00:18:53 sysl at cyc2 Buffering: S42.sw2f [2009 Jan 13 00:18:53  
EST -05:00 %DTP-7-PORTLINKDOWN:Port 3/27 Link down]
Jan 13 00:18:53 sysl at cyc2 Buffering: S42.sw2f [2009 Jan 13 00:18:53  
EST -05:00 %ETHC-5-PORTFROMSTP:Port 3/27 left bridge port 3/27]

The goal is to store the console output within square brackets into  
separate files named after the server that created this output. The  
first line of the example above should go into the file "gwa" while  
the others go into "sw2f". This is what I have so far:

> source s_udp { udp (); };
>
> # --- parse console server output
> # separate port description from message
> parser p_console_output {
>        csv-parser (columns ("CONSOLE.SOURCE", "CONSOLE.MSG")
>                    delimiters (" ")
>                    quote-pairs ("[]")
>                    template ("${MSGONLY}"));
> };
>
> # extract port label from port description
> parser p_console_source {
>        csv-parser (columns ("CONSOLE.PORT", "CONSOLE.LABEL")
>                    delimiters (".")
>                    template ("${CONSOLE.SOURCE}"));
> };
>
> # --- destination of console output
> destination d_console_output {
>         file ("/usr/local/var/log/remote/${HOST_FROM}/console/$ 
> {CONSOLE.LABEL}"
>               template ("${CONSOLE.MSG}\n"));
> };
>
> # --- filter console output
> filter f_console_output {
>        facility (local7) and host ("^sysl at cyc.*");
> };
>
> # --- log console output
> log {
>        source (s_udp);
>        filter (f_console_output);
>        parser (p_console_output);
>        parser (p_console_source);
>        destination (d_console_output);
> };


This works just fine with the last three lines of my example data  
above. The problem I am having is that if the console output (the  
text between square brackets) contains its own square brackets the  
message will cut off right after the first occurrence of the closing  
bracket. The first line of my example data will look like this:

Jan 13 00:14:04.379: %EARL_NETFLOW-SP-4-TCAM_THRLD: Netflow TCAM  
threshold exceeded, TCAM Utilization [97%

instead of

Jan 13 00:14:04.379: %EARL_NETFLOW-SP-4-TCAM_THRLD: Netflow TCAM  
threshold exceeded, TCAM Utilization [97%]

I could probably get around this by using a rewrite rule using PCRE  
but considering the amount of data that needs to be looked at this  
solution is going to be very expensive.

Is there a way to make syslog-ng aware of nested quotes? If not, is  
there something in the pipeline to support this in future releases?  
If not, I will be willing to take a shot and implement this.

Any pointers or suggestions are welcome.

Thanks.

- Michael


More information about the syslog-ng mailing list