[syslog-ng] Rewrite Rule Syntax Confusion

Balazs Scheidler bazsi at balabit.hu
Thu Sep 2 17:39:22 CEST 2010


On Thu, 2010-08-26 at 17:50 -0700, Matthew Hall wrote:
> Hello all,
> 
> I am trying to make a combination of a template and a rewrite rule to 
> write my messages into an extension of WELF format to make them easier 
> to process downstream (the entire point of patterndb I guess).
> 
> The template part was trivial and works perfectly. I just used some 
> regex hacking to extract all 45 variable names I used in my patterndbs, 
> then used gawk to dump them out into a giant (escaped) string like this, 
> and pasted it to the config file.
> 
> template("var1=\"$var1\" var2=\"$var2\" ...\n");
> 
> One minor thing: Currently I am forced to expand varfoo="$varfoo" even 
> if the value of $varfoo is empty because a particular message did not 
> contain "$varfoo".
> 
> I suspect I could fix this by writing a C plugin which checks the length 
> before expanding but I wondered if there were an easier way.
> 
> Else maybe we could make this WELF output techniquie available for 
> everybody because I think the problem could be very common. In any case 
> I can always make the downstream ignore empty expansions for now.

It'd make sense to create a template function for this. I have some
pending patches stuffed somewhere which implements

$(function ...)

to be used in templates. I'm trying to dig that out so you could simply
use:

template("$(format-welf-values)");

Adding plugins into the mixture (the patch is for pre-plugins syslog-ng)
would allow to add plugins implementing template functions.

> 
> The only problem: I want one field at the end of the message to be named 
> 'raw' and contain a double-quote-escaped copy of the raw message. That 
> way if the message contains double quote characters it won't break a 
> parser because they will be escaped right.
> 
> Here is how I thought of doing this after reading the manual:
> 
> rewrite r_add_raw {
>     subst("\"", "\\\"", value("$MSGHDR$MSG"), flags("global")), value("raw"));
> }

you cannot nest rewrite statements, but you can call multiple rewrite
expressions:

rewrite r_add_raw {
	set("$MSGHDR$MSG" value("raw"));
	subst("\"", "\\\"" value("raw"));
};

but again the template function would apply again (not there yet
though):

set("$(escape-quotes $MSGHDR$MSG)" value("raw"));

> 
> However I am getting hit with this syntax error:
> 
> WARNING: Your configuration uses a newly introduced reserved word as 
> identifier, please use a different name; keyword='subst', 
> filename='welf.conf', line='2'
> 
> Apparently I did it wrong, or there is a reason I can't call set on my 
> raw variable to set the raw variable to the double quote escaped string 
> subst'ed from input message in $MSGHDR$MSG. I really hope somebody can 
> comment about how to fix it so that double quotes in the input won't 
> blow things up.
> 
> For now I worked around it temporarily just to get up and running by 
> adding raw=\"$MSGHDR$MSG\" to the end of my template just to see if it 
> would work OK and it does work OK when you don't have double quotes in 
> there.

Hope this helps.

-- 
Bazsi



More information about the syslog-ng mailing list