[syslog-ng] Duplicate configuration items causing memory leak
Balazs Scheidler
bazsi at balabit.hu
Sat Nov 12 17:51:41 CET 2011
On Wed, 2011-11-09 at 14:58 -0800, Dave Rawks wrote:
> On 11/09/2011 12:38 PM, Balazs Scheidler wrote:
> >> Does this patch break the behavior described in the documentation for
> >> 3.3.1?
> >>
> >>> If an object is defined twice (for example the original syslog-ng
> >>> configuration file and the file imported into this configuration
> >>> file both define the same option, source, or other object), then the
> >>> object that is defined later in the configuration file will be
> >>> effective. For example, if you set a global option at the beginning
> >>> of the configuration file, and later include a file that defines the
> >>> same option with a different value, then the option defined in the
> >>> imported file will be used.
> >>
> >> If you cannot overload previously defined objects then the ability to
> >> include config files becomes FAR less useful imho.
> >
> > uhm, uhm. Yes it does. I didn't know this was a documented feature :)
> >
> > This could be controlled (possibly by a configuration variable), but
> > before I do that could you explain your usecase, which makes include
> > files to be less useful?
> >
>
> Well, the standard case for having includes would be for use in
> distribution packaging. Where syslog-ng would ship with a default
> configuration and would then do an include against a directory of files,
> a "conf.d" style setup. Later other packages could drop bits of
> configuration into conf.d. Lets say you install some theoretical log
> collection and parsing application via a distribution provided package.
> Previously when overloading was supported that new package could drop a
> config chunk which overloads a "log object" from the default config so
> that now instead of outputting to a file it outputs to a destination
> object defined in this new config.
It is possible to create a catch-all log statement, where source
definitions need not be listed explicitly, e.g.
source aaa {};
source bbb {};
destination foo {};
log { destination(foo); flags(catch-all); };
This would direct syslog-ng to process all messages, regardless of the
source.
Also, conf.d style inclusion is supported since 3.0; so I would say that
distribution specific configuration can be implemented on what is
available right now.
>
> Actually I was assuming that not only would this behavior persist into
> future versions of syslog-ng but I had also hoped that it would be
> enhanced to allow for things like partial overloads or concatenation of
> existing object definitions such as is available in software such as
> nagios. Since there is no function by which later defined objects can
> interrogate the state of earlier objects nor is there any capability for
> conditional object definition (afaik) there is some inherint limitation
> to the complexity of the configs which could be generated still, but
> this would be a huge step forward in config flexibility.
I understand what you mean, and I can imagine some use-cases, however I
still have my doubts that such a universal configuration file can be
created for syslog-ng that would include all possible needs so that a
package would only need to drop its own 'log definition' to interoperate
with that.
My vision right now is to create SCL blocks to cover applications, that
would:
1) encapsulate all parameters required to track the logs of a given
application
2) would make it very easy to create a syslog-ng configuration file
that uses these blocks
But otherwise how logs are processed are up to the user to specify.
Something along the lines of:
block source proftpd log_dir("/var/log/proftpd") {
file("`log_dir`/transfer.log" follow-freq(1) tags('proftpd-transfer'));
}
source s_local {
system();
proftpd();
...
};
E.g. instead of requiring a rigid structure in the configuration file
and then allow "plugins" to augment that with minor stuff, I'd like to
allow the admin (or the log management product using syslog-ng as a
transport) to create the processing rules she wants but still make it
relatively easy to pull in logs from various applications.
If we have an agent-like setup (e.g. pull logs from all applications and
send them to a central server/relay), you'd need something like:
source s_local {
system();
app1();
app2();
app3();
};
destination d_network { ... };
log { source(s_local); destination(d_network); };
However on the server, you'll most probably want something completely
different:
source s_network {
syslog();
};
log { source(s_network);
log { filter(f_app1); parser(f_app1); destination(d_app1); };
log { filter(f_app2); parser(f_app2); destination(d_app2); };
}
>
> ------Separate but related thought ;)
>
> Speaking of which, it would be nice if there was some method of bundling
> objects together. So that for instance you could define:
>
> > source s_local {
> > internal();
> > unix-dgram("/dev/log");
> > file("/proc/kmsg" program-override("kernel") flags(kernel));
> > };
> > source s_remote {
> > syslog(
> > transport("udp")
> > so_rcvbuf(16777216)
> > );
> > };
> > source s_everything {
> > source(s_local)
> > source(s_remote)
> > );
> > };
>
> I might be missing something, but afaict there is no easy method to do
> such a definition in the documentation.
You can't do this right now, except with catch-all, and using embedded
log statements (like in the example above).
I still can be convinced though, but could you explain how your "stock"
config would like, and how a package like proftpd would drop a config
snippet in the directory to "automatically" extend the local
configuration? And how the same would work in an agent / server like
setup?
I'm almost convinced to remove the error message about this case though,
even though I think that in most cases it is really an unintended config
error.
z
--
Bazsi
More information about the syslog-ng
mailing list