Syslog Ng Versions Save

syslog-ng is an enhanced log daemon, supporting a wide range of input and output methods: syslog, unstructured text, queueing, SQL & NoSQL.

syslog-ng-4.0.1

1 year ago

4.0.1

This is the combination of the news entries of 4.0.0 and 4.0.1.

This is a new major version of syslog-ng, ending the 3.x series which started roughly 13 years ago, on 17th February 2009.

Like all releases in the 3.x series, 4.0.0 is not a breaking change either. Long-term compatibility has been and continues to be an essential objective of syslog-ng; thus, you can still run unchanged configurations that were originally created for syslog-ng 3.0.0.

You can safely upgrade to 4.0.0 if you followed along 3.x, and you should probably also consider upgrading if you are stuck with an older 3.x release.

The new version number primarily indicates that this version of syslog-ng is much more than the software we released 13 years ago. While it does have certain "big-bang" items in its feature list, new features were continuously introduced throughout our 3.x series as well. Our engineering practices have not changed simply because we were working on a new major release: this is the continuation of our previous releases in every respect, produced in the same manner, just with a more catchy version number.

For this reason, there is no separate deprecation or support period for 3.x releases, similarly with our existing practice. We support earlier syslog-ng releases by providing maintenance and fixes in the new release track. Fixes to problems are not backported to earlier releases by the syslog-ng project.

Highlights

Introduce runtime type information to name-value pairs

syslog-ng uses a data model where a log message contains an unordered set of name-value pairs. The values stored in these name-value pairs are usually textual, so syslog-ng has traditionally stored these values in text format.

With the increase of JSON-based message sources and destinations, types became more important. If we encounter a message where a name-value pair originates from a JSON document, and this document contains a member that is numeric, we may want to reproduce that as we send this data to a consumer.

For example, sometimes we extract a numerical metric from a log message, and we need to send this to a consumer, again with the correct type.

To be able to do this, we added runtime type information to the syslog-ng message model: each name-value pair becomes a (name, type, value) triplet.

We introduced the following types:

  • string: simple textual data, mostly utf8 (but not always)
  • int: an integer representable by a 64 bit signed value
  • double: a double precision floating point number
  • boolean: true or false
  • datetime: Date and Time represented by the milliseconds since epoch
  • list: list of strings
  • json: JSON snippet
  • null: an unset value

Apart from the syslog-ng core supporting the notion of types, its use is up to the sources, filters, rewrite rules, parsers and destinations that set or make use of them in any way it makes the most sense for the component in question.

Type-aware comparisons

syslog-ng uses filter expressions to make routing decisions and during the transformation of messages. These filter expressions are used in filter {} or if {} statements, for example.

In these expressions, you can use comparison operators. This example, for instance, uses the '>' operator to check for HTTP response codes greater-or-equal than 500:

     if ("${apache.response}" >= 500) {
     };

Earlier, we had two sets of operators, one for numeric (==, !=, <, >) and the other for string-based comparisons (eq, ne, gt, lt).

The separate operators were cumbersome to use. Users often forgot which operator was the right one for a specific case.

Typing allows us to do the right thing in most cases automatically, and a syntax that allows the user to override the automatic decisions in the rare case.

With that, starting with 4.0, the old-numeric operators have been converted to be type-aware operators. It would compare as strings if both sides of the comparisons are strings. It would compare numerically if at least one side is numeric. A great deal of inspiration was taken from JavaScript, which was considered to be a good model, since the problem space is similar.

See this blog post for more details: https://syslog-ng-future.blog/syslog-ng-4-progress-3-38-1-release/

Capture type information from JSON

When using json-parser(), syslog-ng converts all members of a JSON object to syslog-ng name-value pairs. Prior to the introduction of type support, these name-value pairs were all stored as strings. Any type information originally present in the incoming JSON object was lost.

This meant that if you regenerated the JSON from the name-value pairs using the $(format-json) template function, all numbers, booleans and other types became strings in the output.

There has been a feature in syslog-ng that alleviated the loss of types. This feature was called "type-hints". Type-hints tell $(format-json) to use a specific type on output, independently of a name-value pair's original type, but this type conversion needed to be explicit in the configuration.

An example configuration that parses JSON on input and produces a JSON on output:

log {
    source { ... };
    parser { json-parser(prefix('.json.')); };
    destination { file(... template("$(format-json .json.*)\n")); };
};

To augment the above with type hinting, you could use:

log {
    source { ... };
    parser { json-parser(prefix('.json.')); };
    destination { file(... template("$(format-json .json.* .json.value=int64(${.json.value})\n")); };
};

NOTE the presence of the int64() type hint in the 2nd example.

The new feature introduced with typing is that syslog-ng would automatically store the JSON type information as a syslog-ng type, thus it will transparently carry over types from inputs to output, without having to be explicit about them.

Typing support for various components in syslog-ng

Typing is a feature throughout syslog-ng, and although the gust of it has been explained in the highlights section, some further details are documented in the list down below:

  • type-aware comparisons in filter expressions: as detailed above, the previously numeric operators become type-aware, and the exact comparison performed will be based on types associated with the values we compare.

  • json-parser() and $(format-json): JSON support is massively improved with the introduction of types. For one: type information is retained across input parsing->transformation->output formatting. JSON lists (arrays) are now supported and are converted to syslog-ng lists so they can be manipulated using the $(list-*) template functions. There are other important improvements in how we support JSON.

  • set(), groupset(): in any case where we allow the use of templates, support for type-casting was added, and the type information is properly promoted.

  • db-parser() type support: db-parser() gets support for type casts, assignments within db-parser() rules can associate types with values using the "type" attribute, e.g. <value name="foobar" type="integer">$PID</value>. The “integer” is a type-cast that associates $foobar with an integer type. db-parser()’s internal parsers (e.g. @NUMBER@) will also associate type information with a name-value pair automatically.

  • add-contextual-data() type support: any new name-value pair that is populated using add-contextual-data() will propagate type information, similarly to db-parser().

  • map-value-pairs() type support: propagate type information

  • SQL type support: the sql() driver gained support for types, so that columns with specific types will be stored as those types.

  • template type support: templates can now be casted explicitly to a specific type, but they also propagate type information from macros/template functions and values in the template string

  • value-pairs type support: value-pairs form the backbone of specifying a set of name-value pairs and associated transformations to generate JSON or a key-value pair format. It also gained support for types, the existing type-hinting feature that was already part of value-pairs was adapted and expanded to other parts of syslog-ng.

  • python() typing: support for typing was added to all Python components (sources, destinations, parsers and template functions), along with more documentation & examples on how the Python bindings work. All types except json() are supported as they are queried- or changed by Python code.

  • on-disk serialized formats (e.g. disk buffer/logstore): we remain compatible with messages serialized with an earlier version of syslog-ng, and the format we choose remains compatible for “downgrades” as well. E.g. even if a new version of syslog-ng serialized a message, the old syslog-ng and associated tools will be able to read it (sans type information of course)

Improved support for lists (arrays)

For syslog-ng, everything is traditionally a string. A convention was started with syslog-ng in v3.10, where a comma-separated format could be used as a kind of array using the $(list-*) family of template functions.

For example, $(list-head) takes off the first element in a list, while $(list-tail) takes the last. You can index and slice list elements using the $(list-slice) and $(list-nth) functions and so on.

syslog-ng has started to return such lists in various cases, so they can be manipulated using these list-specific template functions. These include the xml-parser(), or the $(explode) template function, but there are others.

Here is an example that has worked since syslog-ng 3.10:

  # MSG contains foo:bar:baz
  # - the $(list-head) takes off the first element of a list
  # - the $(explode) expression splits a string at the specified separator, ':' in this case.
  $(list-head $(explode : $MSG))

New functions that improve these features:

  • JSON arrays are converted to lists, making it a lot easier to slice and extract information from JSON arrays. Of course, $(format-json) will take lists and convert them back to arrays.

  • The $* is a new macro that converts the internal list of match variables ($1, $2, $3 and so on) to a list, usable with $(list-*) template functions. These match variables have traditionally been filled by regular expressions when a capture group in a regexp matches.

  • The set-matches() rewrite operation performs the reverse; it assigns the match variables to list elements, making it easier to use list elements in template expressions by assigning them to $1, $2, $3 and so on.

  • Top-level JSON arrays (e.g. ones where the incoming JSON data is an array and not an object) are now accepted, and the array elements are assigned to the match variables.

Python support

syslog-ng has had support for Python-based processing elements since 3.7, released in 2015, which was greatly expanded early 2017 (3.9, LogParser) and late 2018 (3.18, LogSource and LogFetcher).

This support has now been improved in a number of ways to make its use both easier and its potential more powerful.

A framework was added to syslog-ng that allows seamless implementation of syslog-ng features in Python, with a look and feel of that of a native implementation. An example for using this framework is available in the modules/python-modules/example directory, as well as detailed documentation in the form of modules/python-modules/README.md that is installed to /etc/syslog-ng/python.

The framework consists of these changes:

  • syslogng Python package: native code provided by the syslog-ng core has traditionally been exported in the syslogng Python module. An effort was made to make these native classes exported by the C layer more discoverable and more intuitive. As a part of this effort, the interfaces for all key Python components (LogSource, LogFetcher, LogDestination, LogParser) were exposed in the syslogng module, along with in-line documentation.

  • /etc/syslog-ng/python: syslog-ng now automatically adds this directory to the PYTHONPATH so that you have an easy place to add Python modules required by your configuration.

  • Python virtualenv support for production use: more sophisticated Python modules usually have 3rd party dependencies, which either needed to be installed from the OS repositories (using the apt-get or yum/dnf tools) or PyPI (using the pip tool). syslog-ng now acquired support for an embedded Python virtualenv (/var/lib/syslog-ng/python-venv or similar, depending on the installation layout), meaning that these requirements can be installed privately, without deploying them in the system PYTHONPATH where it might collide with other applications. The base set of requirements that syslog-ng relies on can be installed via the syslog-ng-update-virtualenv script, which has been added to our rpm/deb postinst scripts.

    Our mod-python module validates this virtualenv at startup and activates it automatically if the validation is successful. You can disable this behaviour by loading the Python module explicitly with the following configuration statement:

        @module mod-python use-virtualenv(no)
    

    You can force syslog-ng to use a specific virtualenv by activating it first, prior to executing syslog-ng. In this case, syslog-ng will not try to use its private virtualenv, rather it would use the one activated when it was started. It assumes that any requirements needed for syslog-ng functionality implemented in Python are deployed by the user. These requirements are listed in the /usr/lib/syslog-ng/python/requirements.txt file.

  • SCL snippets in Python plugins: by adding an scl/whatever.conf file to your Python-based syslog-ng plugin, you can easily wrap a Python-based log processing functionality with a syslog-ng block {}, so the user can use a syntax very similar to native plugins in their main configuration.

  • confgen in Python: should a simple block {} statement not be enough to wrap the functionality implemented in Python, the mod-python module now supports confgen functions to be implemented in Python. confgen has been a feature in syslog-ng for a long time that allows you to generate configuration snippets dynamically by executing an external program or script. This has now been ported to Python, e.g. syslog-ng can invoke a Python function to generate parts of its configuration.

    Example:

    @version: 4.0
    python {
    from syslogng import register_config_generator
    def generate_foobar(args):
            print(args)
            return "tcp(port(2000))"
    #
    # this registers a plugin in the "source" context named "foobar"
    # which would invoke the generate_foobar() function when a foobar() source
    # reference is encountered.
    #
    register_config_generator("source", "foobar", generate_foobar)
    };
    log {
            # we are actually calling the generate_foobar() function in this
            # source, passing all parameters as values in the "args" dictionary
            source { foobar(this(is) a(value)); };
            destination { file("logfile"); };
    };
    

Features

  • kubernetes() source and kubernetes-metadata-parser(): these two components gained the ability to enrich log messages with Kubernetes metadata. When reading container logs, syslog-ng would query the Kubernetes API for the following fields and add them to the log-message. The returned meta-data is cached in memory, so not all log messages trigger a new query.

    .k8s.pod_uuid
    .k8s.labels.<label_name>
    .k8s.annotations.<annotation_name>
    .k8s.namespace_name
    .k8s.pod_name
    .k8s.container_name
    .k8s.container_image
    .k8s.container_hash
    .k8s.docker_id
    
  • java() destinations: fixed compatibility with newer Java versions, syslog-ng is now able to compile up to Java 18.

  • disk-buffer: Added prealloc() option to preallocate new disk-buffer files. (#4056)

  • disk-buffer: The default value of truncate-size-ratio() has been changed to 1, which means truncation is disabled by default. This means that by default, the disk-buffer files will gradually become larger and will never reduce in size. This improves performance. (#4056)

  • log-level(): added a new global option to control syslog-ng's own internal log level. This augments the existing support for doing the same via the command line (via -d, -v and -t options) and via syslog-ng-ctl. This change also causes higher log-levels to include messages from lower log-levels, e.g. "trace" also implies "debug" and "verbose". By adding this capability to the configuration, it becomes easier to control logging in containerized environments where changing command line options is more challenging.

    syslog-ng-ctl log-level: this new subcommand in syslog-ng-ctl allows setting the log level in a more intuitive way, compared to the existing syslog-ng-ctl verbose|debug|trace -s syntax.

    syslog-ng --log-level: this new command line option for the syslog-ng main binary allows you to set the desired log-level similar to how you can control it from the configuration or through syslog-ng-ctl. (#4091)

  • network/syslog/tls context options: SSL_CONF_cmd support

    SSL_CONF_cmd TLS configuration support for network() and syslog() driver has been added.

    OpenSSL offers an alternative, software-independent configuration mechanism through the SSL_CONF_cmd interface to support a common solution for setting the so many various SSL_CTX and SSL options that can be set earlier via multiple, separated openssl function calls only. This update implements that similar to the mod_ssl in Apache.

    IMPORTANT: The newly introduced openssl-conf-cmds always has the highest priority, its content parsed last, so it will override any other options that can be found in the tls() section, does not matter if they appear before or after openssl-conf-cmds.

    As described in the SSL_CONF_cmd documentation, the order of operations within openssl-conf-cmds() is significant and the commands are executed in top-down order. This means that if there are multiple occurrences of setting the same option then the 'last wins'. This is also true for options that can be set multiple ways (e.g. used cipher suites and/or protocols).

    Example config:

    source source_name {
        network (
            ip(0.0.0.0)
            port(6666)
            transport("tls")
            tls(
                ca-dir("/etc/ca.d")
                key-file("/etc/cert.d/serverkey.pem")
                cert-file("/etc/cert.d/servercert.pem")
                peer-verify(yes)
    
                openssl-conf-cmds(
                    # For system wide available cipher suites use: /usr/bin/openssl ciphers -v
                    # For formatting rules see: https://www.openssl.org/docs/man1.1.1/man3/SSL_CONF_cmd.html
                    # For quick and dirty testing try: https://github.com/rbsec/sslscan
                    #
                    "CipherString" => "ECDHE-RSA-AES128-SHA",                                   # TLSv1.2 and bellow
                    "CipherSuites" => "TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",    # TLSv1.3+ (OpenSSl 1.1.1+)
    
                    "Options" => "PrioritizeChaCha",
                    "Protocol" => "-ALL,TLSv1.3",
                )
            )
        );
    };
    
  • network/syslog/http destination: OCSP stapling support

    OCSP stapling support for network destinations and for the http() module has been added.

    When OCSP stapling verification is enabled, the server will be requested to send back OCSP status responses. This status response will be verified using the trust store configured by the user (ca-file(), ca-dir(), pkcs12-file()).

    Note: RFC 6961 multi-stapling and TLS 1.3-provided multiple responses are currently not validated, only the peer certificate is verified.

    Example config:

    destination {
    
        network("test.tld" transport(tls)
            tls(
                pkcs12-file("/path/to/test.p12")
                peer-verify(yes)
                ocsp-stapling-verify(yes)
            )
        );
    
        http(url("https://test.tld") method("POST") tls(peer-verify(yes) ocsp-stapling-verify(yes)));
    };
    

    (#4082)

  • Python LogMessage class: get_pri() and get_timestamp() methods were added that allow the query of the syslog-style priority and the message timestamp, respectively. The return value of get_pri() is an integer, while get_timestamp() returns a Python datetime.datetime instance. Some macros that were previously unavailable from Python (e.g. the STAMP, R_STAMP and C_STAMP macros) are now made available.

  • Python Logger: the low-level Logger class exported by syslog-ng was wrapped by a logging.LogHandler class so that normal Python APIs for logging can now be used.

  • db-parser() and grouping-by(): added a prefix() option to both db-parser() and grouping-by() that allows specifying an extra prefix to be prepended to all name-value pairs that get extracted from messages using patterns or tags.

  • csv-parser(): add a new dialect, called escape-backslash-with-sequences which uses "" as an escape character but also supports C-style escape sequences, like "\n" or "\r".

Bugfixes

  • tcp(), network() or syslog() destinations: fixed a crash that could happen after reload when a kept-alive connection is terminated, in case the target server is configured using a hostname (and not an IP address) and that name becomes unresolvable (e.g. dropped from DNS or /etc/hosts) (#4044)

  • python() destination: Fixed a crash, when trying to resolve the "R_STAMP", "P_STAMP" or "STAMP" macros from Python code. (#4057)

  • Python LogSource & LogFetcher: a potential deadlock was fixed in acknowledgement tracking.

  • Python LogTemplate: the use of template functions in templates instantiated from Python caused a crash, which has been fixed.

  • grouping-by() persist-name() option: fixed a segmentation fault in the grammar. (#4180)

  • $(format-json): fix a bug in the --key-delimiter option introduced in 3.38, which causes the generated JSON to contain multiple values for the same key in case the key in question contains a nested object and key-delimiter specified is not the dot character. (#4127)

  • add-contextual-data(): add compatibility warnings and update advise in case of the value field of the add-contextual-data() database contains an expression that resembles the new type-hinting syntax: type(value).

  • syslog-ng --help screen: the output for the --help command line option has included sample paths to various files that contained autoconf style directory references (e.g. ${prefix}/etc for instance). This is now fixed, these paths will contain the expanded path. Fixes Debian Bug report #962839: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=962839 (#4143)

  • csv-parser(): fixed the processing of the dialect() parameter, which was not taken into consideration.

  • apache-accesslog-parser(): Apache may use backslash-style escapes in the request field, so support it by setting the csv-parser() dialect to escape-backslash-with-sequences. Also added validation that the rawrequest field contains a valid HTTP request and only extract verb, request and httpversion if this is the case.

  • riemann: fixed severity levels of Riemann diagnostics messages, the error returned by riemann_communicate() was previously only logged at the trace level and was even incomplete: not covering the case where riemann_communicate() returns NULL. (#4238)

Packaging

  • python: python2 support is now completely removed. syslog-ng can no longer be configured with --with-python=2. (#4057)

  • python: Python 2 support is now completely removed from the syslog-ng functional test framework, called Light, too. Light will support only Python 3 from now. (#4174)

  • Python virtualenv support for development use: syslog-ng is now capable of using a build-time virtualenv, where all Python development tools are automatically deployed by the build system. You can control if you want to use this using the --with-python-packages configure option. There are three possible values for this parameter:

    • venv: denoting that you want to use the virtualenv and install all these requirements automatically using pip, into the venv.
    • system: meaning that you want to rely on the system Python without using a virtualenv. syslog-ng build scripts would install requirements automatically to the system Python path usually /usr/local/lib/pythonX.Y
    • none: disable deploying packages automatically. All dependencies are assumed to be present in the system Python before running the syslog-ng build process.

    Please note that syslog-ng has acquired quite a number of these development time dependencies with the growing number of functionality the Python binding offers, so using the system or none settings are considered advanced usage, meant to be used for distro packaging.

  • make dist: fixed make dist of FreeBSD so that source tarballs can easily be produced even if running on FreeBSD. (#4163)

  • Debian and derivatives: The syslog-ng-mod-python package is now built with python3 on the following platforms:

    • debian-stretch
    • debian-buster
    • ubuntu-bionic (#4057)
  • dbld: Removed support for ubuntu-xenial. (#4057)

  • dbld: Updated support from Fedora 35 to Fedora 37

  • Leaner production docker image: the balabit/syslog-ng docker image stops pulling in logrotate and its dependencies into the image. logrotate recursively pulled in cron and exim4 which are inoperable within the image anyway and causes the image to be larger as well as increasing the potential attack surface.

  • Debian packaging: logrotate became Suggested instead of Recommended to avoid installing logrotate by default.

  • scl: To match the way scls are packaged in debian, we have added a syslog-ng-scl package. This makes it possible to upgrade from the official debian syslog-ng package to the ose-repo provided one. (#4252) (#4256)

Other changes

  • sumologic-http() improvements

    Improved defaults: sumologic-http() originally sent incomplete messages (only the $MESSAGE part) to Sumo Logic by default. The new default is a JSON object, containing all name-value pairs. This is a breaking change if you used the default value as it was, but this is not really anticipated. To override the new message format or revert to the old default, the template() option can be used.

    sumologic-http() enables batching by default to significantly increase the destination's performance.

    The tls() block has become optional, Sumo Logic servers will be verified using the system's certificate store by default. (#4124)

Installation packages

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Andras Mitzki, Attila Szakacs, Attila Szalay, Balazs Scheidler, Bálint Horváth, Gabor Nagy, István Hoffmann, Joshua Root, László Várady, Szilárd Parrag

syslog-ng-4.0.0

1 year ago

4.0.0

This is a new major version of syslog-ng, ending the 3.x series which started roughly 13 years ago, on 17th February 2009.

Like all releases in the 3.x series, 4.0.0 is not a breaking change either. Long-term compatibility has been and continues to be an essential objective of syslog-ng; thus, you can still run unchanged configurations that were originally created for syslog-ng 3.0.0.

You can safely upgrade to 4.0.0 if you followed along 3.x, and you should probably also consider upgrading if you are stuck with an older 3.x release.

The new version number primarily indicates that this version of syslog-ng is much more than the software we released 13 years ago. While it does have certain "big-bang" items in its feature list, new features were continuously introduced throughout our 3.x series as well. Our engineering practices have not changed simply because we were working on a new major release: this is the continuation of our previous releases in every respect, produced in the same manner, just with a more catchy version number.

For this reason, there is no separate deprecation or support period for 3.x releases, similarly with our existing practice. We support earlier syslog-ng releases by providing maintenance and fixes in the new release track. Fixes to problems are not backported to earlier releases by the syslog-ng project.

Highlights

Introduce runtime type information to name-value pairs

syslog-ng uses a data model where a log message contains an unordered set of name-value pairs. The values stored in these name-value pairs are usually textual, so syslog-ng has traditionally stored these values in text format.

With the increase of JSON-based message sources and destinations, types became more important. If we encounter a message where a name-value pair originates from a JSON document, and this document contains a member that is numeric, we may want to reproduce that as we send this data to a consumer.

For example, sometimes we extract a numerical metric from a log message, and we need to send this to a consumer, again with the correct type.

To be able to do this, we added runtime type information to the syslog-ng message model: each name-value pair becomes a (name, type, value) triplet.

We introduced the following types:

  • string: simple textual data, mostly utf8 (but not always)
  • int: an integer representable by a 64 bit signed value
  • double: a double precision floating point number
  • boolean: true or false
  • datetime: Date and Time represented by the milliseconds since epoch
  • list: list of strings
  • json: JSON snippet
  • null: an unset value

Apart from the syslog-ng core supporting the notion of types, its use is up to the sources, filters, rewrite rules, parsers and destinations that set or make use of them in any way it makes the most sense for the component in question.

Type-aware comparisons

syslog-ng uses filter expressions to make routing decisions and during the transformation of messages. These filter expressions are used in filter {} or if {} statements, for example.

In these expressions, you can use comparison operators. This example, for instance, uses the '>' operator to check for HTTP response codes greater-or-equal than 500:

     if ("${apache.response}" >= 500) {
     };

Earlier, we had two sets of operators, one for numeric (==, !=, <, >) and the other for string-based comparisons (eq, ne, gt, lt).

The separate operators were cumbersome to use. Users often forgot which operator was the right one for a specific case.

Typing allows us to do the right thing in most cases automatically, and a syntax that allows the user to override the automatic decisions in the rare case.

With that, starting with 4.0, the old-numeric operators have been converted to be type-aware operators. It would compare as strings if both sides of the comparisons are strings. It would compare numerically if at least one side is numeric. A great deal of inspiration was taken from JavaScript, which was considered to be a good model, since the problem space is similar.

See this blog post for more details: https://syslog-ng-future.blog/syslog-ng-4-progress-3-38-1-release/

Capture type information from JSON

When using json-parser(), syslog-ng converts all members of a JSON object to syslog-ng name-value pairs. Prior to the introduction of type support, these name-value pairs were all stored as strings. Any type information originally present in the incoming JSON object was lost.

This meant that if you regenerated the JSON from the name-value pairs using the $(format-json) template function, all numbers, booleans and other types became strings in the output.

There has been a feature in syslog-ng that alleviated the loss of types. This feature was called "type-hints". Type-hints tell $(format-json) to use a specific type on output, independently of a name-value pair's original type, but this type conversion needed to be explicit in the configuration.

An example configuration that parses JSON on input and produces a JSON on output:

log {
    source { ... };
    parser { json-parser(prefix('.json.')); };
    destination { file(... template("$(format-json .json.*)\n")); };
};

To augment the above with type hinting, you could use:

log {
    source { ... };
    parser { json-parser(prefix('.json.')); };
    destination { file(... template("$(format-json .json.* .json.value=int64(${.json.value})\n")); };
};

NOTE the presence of the int64() type hint in the 2nd example.

The new feature introduced with typing is that syslog-ng would automatically store the JSON type information as a syslog-ng type, thus it will transparently carry over types from inputs to output, without having to be explicit about them.

Typing support for various components in syslog-ng

Typing is a feature throughout syslog-ng, and although the gust of it has been explained in the highlights section, some further details are documented in the list down below:

  • type-aware comparisons in filter expressions: as detailed above, the previously numeric operators become type-aware, and the exact comparison performed will be based on types associated with the values we compare.

  • json-parser() and $(format-json): JSON support is massively improved with the introduction of types. For one: type information is retained across input parsing->transformation->output formatting. JSON lists (arrays) are now supported and are converted to syslog-ng lists so they can be manipulated using the $(list-*) template functions. There are other important improvements in how we support JSON.

  • set(), groupset(): in any case where we allow the use of templates, support for type-casting was added, and the type information is properly promoted.

  • db-parser() type support: db-parser() gets support for type casts, assignments within db-parser() rules can associate types with values using the "type" attribute, e.g. <value name="foobar" type="integer">$PID</value>. The “integer” is a type-cast that associates $foobar with an integer type. db-parser()’s internal parsers (e.g. @NUMBER@) will also associate type information with a name-value pair automatically.

  • add-contextual-data() type support: any new name-value pair that is populated using add-contextual-data() will propagate type information, similarly to db-parser().

  • map-value-pairs() type support: propagate type information

  • SQL type support: the sql() driver gained support for types, so that columns with specific types will be stored as those types.

  • template type support: templates can now be casted explicitly to a specific type, but they also propagate type information from macros/template functions and values in the template string

  • value-pairs type support: value-pairs form the backbone of specifying a set of name-value pairs and associated transformations to generate JSON or a key-value pair format. It also gained support for types, the existing type-hinting feature that was already part of value-pairs was adapted and expanded to other parts of syslog-ng.

  • python() typing: support for typing was added to all Python components (sources, destinations, parsers and template functions), along with more documentation & examples on how the Python bindings work. All types except json() are supported as they are queried- or changed by Python code.

  • on-disk serialized formats (e.g. disk buffer/logstore): we remain compatible with messages serialized with an earlier version of syslog-ng, and the format we choose remains compatible for “downgrades” as well. E.g. even if a new version of syslog-ng serialized a message, the old syslog-ng and associated tools will be able to read it (sans type information of course)

Improved support for lists (arrays)

For syslog-ng, everything is traditionally a string. A convention was started with syslog-ng in v3.10, where a comma-separated format could be used as a kind of array using the $(list-*) family of template functions.

For example, $(list-head) takes off the first element in a list, while $(list-tail) takes the last. You can index and slice list elements using the $(list-slice) and $(list-nth) functions and so on.

syslog-ng has started to return such lists in various cases, so they can be manipulated using these list-specific template functions. These include the xml-parser(), or the $(explode) template function, but there are others.

Here is an example that has worked since syslog-ng 3.10:

  # MSG contains foo:bar:baz
  # - the $(list-head) takes off the first element of a list
  # - the $(explode) expression splits a string at the specified separator, ':' in this case.
  $(list-head $(explode : $MSG))

New functions that improve these features:

  • JSON arrays are converted to lists, making it a lot easier to slice and extract information from JSON arrays. Of course, $(format-json) will take lists and convert them back to arrays.

  • The $* is a new macro that converts the internal list of match variables ($1, $2, $3 and so on) to a list, usable with $(list-*) template functions. These match variables have traditionally been filled by regular expressions when a capture group in a regexp matches.

  • The set-matches() rewrite operation performs the reverse; it assigns the match variables to list elements, making it easier to use list elements in template expressions by assigning them to $1, $2, $3 and so on.

  • Top-level JSON arrays (e.g. ones where the incoming JSON data is an array and not an object) are now accepted, and the array elements are assigned to the match variables.

Python support

syslog-ng has had support for Python-based processing elements since 3.7, released in 2015, which was greatly expanded early 2017 (3.9, LogParser) and late 2018 (3.18, LogSource and LogFetcher).

This support has now been improved in a number of ways to make its use both easier and its potential more powerful.

A framework was added to syslog-ng that allows seamless implementation of syslog-ng features in Python, with a look and feel of that of a native implementation. An example for using this framework is available in the modules/python-modules/example directory, as well as detailed documentation in the form of modules/python-modules/README.md that is installed to /etc/syslog-ng/python.

The framework consists of these changes:

  • syslogng Python package: native code provided by the syslog-ng core has traditionally been exported in the syslogng Python module. An effort was made to make these native classes exported by the C layer more discoverable and more intuitive. As a part of this effort, the interfaces for all key Python components (LogSource, LogFetcher, LogDestination, LogParser) were exposed in the syslogng module, along with in-line documentation.

  • /etc/syslog-ng/python: syslog-ng now automatically adds this directory to the PYTHONPATH so that you have an easy place to add Python modules required by your configuration.

  • Python virtualenv support for production use: more sophisticated Python modules usually have 3rd party dependencies, which either needed to be installed from the OS repositories (using the apt-get or yum/dnf tools) or PyPI (using the pip tool). syslog-ng now acquired support for an embedded Python virtualenv (/var/lib/syslog-ng/python-venv or similar, depending on the installation layout), meaning that these requirements can be installed privately, without deploying them in the system PYTHONPATH where it might collide with other applications. The base set of requirements that syslog-ng relies on can be installed via the syslog-ng-update-virtualenv script, which has been added to our rpm/deb postinst scripts.

    Our mod-python module validates this virtualenv at startup and activates it automatically if the validation is successful. You can disable this behaviour by loading the Python module explicitly with the following configuration statement:

        `@module mod-python use-virtualenv(no)`
    

    You can force syslog-ng to use a specific virtualenv by activating it first, prior to executing syslog-ng. In this case, syslog-ng will not try to use its private virtualenv, rather it would use the one activated when it was started. It assumes that any requirements needed for syslog-ng functionality implemented in Python are deployed by the user. These requirements are listed in the /usr/lib/syslog-ng/python/requirements.txt file.

  • SCL snippets in Python plugins: by adding an scl/whatever.conf file to your Python-based syslog-ng plugin, you can easily wrap a Python-based log processing functionality with a syslog-ng block {}, so the user can use a syntax very similar to native plugins in their main configuration.

  • confgen in Python: should a simple block {} statement not be enough to wrap the functionality implemented in Python, the mod-python module now supports confgen functions to be implemented in Python. confgen has been a feature in syslog-ng for a long time that allows you to generate configuration snippets dynamically by executing an external program or script. This has now been ported to Python, e.g. syslog-ng can invoke a Python function to generate parts of its configuration.

    Example:

    @version: 4.0
    python {
    from syslogng import register_config_generator
    def generate_foobar(args):
            print(args)
            return "tcp(port(2000))"
    #
    # this registers a plugin in the "source" context named "foobar"
    # which would invoke the generate_foobar() function when a foobar() source
    # reference is encountered.
    #
    register_config_generator("source", "foobar", generate_foobar)
    };
    log {
            # we are actually calling the generate_foobar() function in this
            # source, passing all parameters as values in the "args" dictionary
            source { foobar(this(is) a(value)); };
            destination { file("logfile"); };
    };
    

Features

  • kubernetes() source and kubernetes-metadata-parser(): these two components gained the ability to enrich log messages with Kubernetes metadata. When reading container logs, syslog-ng would query the Kubernetes API for the following fields and add them to the log-message. The returned meta-data is cached in memory, so not all log messages trigger a new query.

    .k8s.pod_uuid
    .k8s.labels.<label_name>
    .k8s.annotations.<annotation_name>
    .k8s.namespace_name
    .k8s.pod_name
    .k8s.container_name
    .k8s.container_image
    .k8s.container_hash
    .k8s.docker_id
    
  • java() destinations: fixed compatibility with newer Java versions, syslog-ng is now able to compile up to Java 18.

  • disk-buffer: Added prealloc() option to preallocate new disk-buffer files. (#4056)

  • disk-buffer: The default value of truncate-size-ratio() has been changed to 1, which means truncation is disabled by default. This means that by default, the disk-buffer files will gradually become larger and will never reduce in size. This improves performance. (#4056)

  • log-level(): added a new global option to control syslog-ng's own internal log level. This augments the existing support for doing the same via the command line (via -d, -v and -t options) and via syslog-ng-ctl. This change also causes higher log-levels to include messages from lower log-levels, e.g. "trace" also implies "debug" and "verbose". By adding this capability to the configuration, it becomes easier to control logging in containerized environments where changing command line options is more challenging.

    syslog-ng-ctl log-level: this new subcommand in syslog-ng-ctl allows setting the log level in a more intuitive way, compared to the existing syslog-ng-ctl verbose|debug|trace -s syntax.

    syslog-ng --log-level: this new command line option for the syslog-ng main binary allows you to set the desired log-level similar to how you can control it from the configuration or through syslog-ng-ctl. (#4091)

  • network/syslog/tls context options: SSL_CONF_cmd support

    SSL_CONF_cmd TLS configuration support for network() and syslog() driver has been added.

    OpenSSL offers an alternative, software-independent configuration mechanism through the SSL_CONF_cmd interface to support a common solution for setting the so many various SSL_CTX and SSL options that can be set earlier via multiple, separated openssl function calls only. This update implements that similar to the mod_ssl in Apache.

    IMPORTANT: The newly introduced openssl-conf-cmds always has the highest priority, its content parsed last, so it will override any other options that can be found in the tls() section, does not matter if they appear before or after openssl-conf-cmds.

    As described in the SSL_CONF_cmd documentation, the order of operations within openssl-conf-cmds() is significant and the commands are executed in top-down order. This means that if there are multiple occurrences of setting the same option then the 'last wins'. This is also true for options that can be set multiple ways (e.g. used cipher suites and/or protocols).

    Example config:

    source source_name {
        network (
            ip(0.0.0.0)
            port(6666)
            transport("tls")
            tls(
                ca-dir("/etc/ca.d")
                key-file("/etc/cert.d/serverkey.pem")
                cert-file("/etc/cert.d/servercert.pem")
                peer-verify(yes)
    
                openssl-conf-cmds(
                    # For system wide available cipher suites use: /usr/bin/openssl ciphers -v
                    # For formatting rules see: https://www.openssl.org/docs/man1.1.1/man3/SSL_CONF_cmd.html
                    # For quick and dirty testing try: https://github.com/rbsec/sslscan
                    #
                    "CipherString" => "ECDHE-RSA-AES128-SHA",                                   # TLSv1.2 and bellow
                    "CipherSuites" => "TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",    # TLSv1.3+ (OpenSSl 1.1.1+)
    
                    "Options" => "PrioritizeChaCha",
                    "Protocol" => "-ALL,TLSv1.3",
                )
            )
        );
    };
    
  • network/syslog/http destination: OCSP stapling support

    OCSP stapling support for network destinations and for the http() module has been added.

    When OCSP stapling verification is enabled, the server will be requested to send back OCSP status responses. This status response will be verified using the trust store configured by the user (ca-file(), ca-dir(), pkcs12-file()).

    Note: RFC 6961 multi-stapling and TLS 1.3-provided multiple responses are currently not validated, only the peer certificate is verified.

    Example config:

    destination {
    
        network("test.tld" transport(tls)
            tls(
                pkcs12-file("/path/to/test.p12")
                peer-verify(yes)
                ocsp-stapling-verify(yes)
            )
        );
    
        http(url("https://test.tld") method("POST") tls(peer-verify(yes) ocsp-stapling-verify(yes)));
    };
    

    (#4082)

  • Python LogMessage class: get_pri() and get_timestamp() methods were added that allow the query of the syslog-style priority and the message timestamp, respectively. The return value of get_pri() is an integer, while get_timestamp() returns a Python datetime.datetime instance. Some macros that were previously unavailable from Python (e.g. the STAMP, R_STAMP and C_STAMP macros) are now made available.

  • Python Logger: the low-level Logger class exported by syslog-ng was wrapped by a logging.LogHandler class so that normal Python APIs for logging can now be used.

  • db-parser() and grouping-by(): added a prefix() option to both db-parser() and grouping-by() that allows specifying an extra prefix to be prepended to all name-value pairs that get extracted from messages using patterns or tags.

  • csv-parser(): add a new dialect, called escape-backslash-with-sequences which uses "" as an escape character but also supports C-style escape sequences, like "\n" or "\r".

Bugfixes

  • tcp(), network() or syslog() destinations: fixed a crash that could happen after reload when a kept-alive connection is terminated, in case the target server is configured using a hostname (and not an IP address) and that name becomes unresolvable (e.g. dropped from DNS or /etc/hosts) (#4044)

  • python() destination: Fixed a crash, when trying to resolve the "R_STAMP", "P_STAMP" or "STAMP" macros from Python code. (#4057)

  • Python LogSource & LogFetcher: a potential deadlock was fixed in acknowledgement tracking.

  • Python LogTemplate: the use of template functions in templates instantiated from Python caused a crash, which has been fixed.

  • grouping-by() persist-name() option: fixed a segmentation fault in the grammar. (#4180)

  • $(format-json): fix a bug in the --key-delimiter option introduced in 3.38, which causes the generated JSON to contain multiple values for the same key in case the key in question contains a nested object and key-delimiter specified is not the dot character. (#4127)

  • add-contextual-data(): add compatibility warnings and update advise in case of the value field of the add-contextual-data() database contains an expression that resembles the new type-hinting syntax: type(value).

  • syslog-ng --help screen: the output for the --help command line option has included sample paths to various files that contained autoconf style directory references (e.g. ${prefix}/etc for instance). This is now fixed, these paths will contain the expanded path. Fixes Debian Bug report #962839: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=962839 (#4143)

  • csv-parser(): fixed the processing of the dialect() parameter, which was not taken into consideration.

  • apache-accesslog-parser(): Apache may use backslash-style escapes in the request field, so support it by setting the csv-parser() dialect to escape-backslash-with-sequences. Also added validation that the rawrequest field contains a valid HTTP request and only extract verb, request and httpversion if this is the case.

  • riemann: fixed severity levels of Riemann diagnostics messages, the error returned by riemann_communicate() was previously only logged at the trace level and was even incomplete: not covering the case where riemann_communicate() returns NULL. (#4238)

Packaging

  • python: python2 support is now completely removed. syslog-ng can no longer be configured with --with-python=2. (#4057)

  • python: Python 2 support is now completely removed from the syslog-ng functional test framework, called Light, too. Light will support only Python 3 from now. (#4174)

  • Python virtualenv support for development use: syslog-ng is now capable of using a build-time virtualenv, where all Python development tools are automatically deployed by the build system. You can control if you want to use this using the --with-python-packages configure option. There are three possible values for this parameter:

    • venv: denoting that you want to use the virtualenv and install all these requirements automatically using pip, into the venv.
    • system: meaning that you want to rely on the system Python without using a virtualenv. syslog-ng build scripts would install requirements automatically to the system Python path usually /usr/local/lib/pythonX.Y
    • none: disable deploying packages automatically. All dependencies are assumed to be present in the system Python before running the syslog-ng build process.

    Please note that syslog-ng has acquired quite a number of these development time dependencies with the growing number of functionality the Python binding offers, so using the system or none settings are considered advanced usage, meant to be used for distro packaging.

  • make dist: fixed make dist of FreeBSD so that source tarballs can easily be produced even if running on FreeBSD. (#4163)

  • Debian and derivatives: The syslog-ng-mod-python package is now built with python3 on the following platforms:

    • debian-stretch
    • debian-buster
    • ubuntu-bionic (#4057)
  • dbld: Removed support for ubuntu-xenial. (#4057)

  • dbld: Updated support from Fedora 35 to Fedora 37

  • Leaner production docker image: the balabit/syslog-ng docker image stops pulling in logrotate and its dependencies into the image. logrotate recursively pulled in cron and exim4 which are inoperable within the image anyway and causes the image to be larger as well as increasing the potential attack surface.

  • Debian packaging: logrotate became Suggested instead of Recommended to avoid installing logrotate by default.

Other changes

  • sumologic-http() improvements

    Improved defaults: sumologic-http() originally sent incomplete messages (only the $MESSAGE part) to Sumo Logic by default. The new default is a JSON object, containing all name-value pairs. This is a breaking change if you used the default value as it was, but this is not really anticipated. To override the new message format or revert to the old default, the template() option can be used.

    sumologic-http() enables batching by default to significantly increase the destination's performance.

    The tls() block has become optional, Sumo Logic servers will be verified using the system's certificate store by default. (#4124)

Installation packages

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Andras Mitzki, Attila Szakacs, Attila Szalay, Balazs Scheidler, Bálint Horváth, Gabor Nagy, István Hoffmann, Joshua Root, László Várady, Szilárd Parrag

syslog-ng-3.38.1

1 year ago

3.38.1

Highlights

Sneak peek into syslog-ng v4.0

syslog-ng v4.0 is right around the corner.

This release (v3.38.1) contains all major changes, however, they are currently all hidden behind a feature flag. To enable and try those features, you need to specify @version: 4.0 at the top of the configuration file.

You can find out more about the 4.0 changes and features here.

Read our practical introduction to typing at syslog-ng-future.blog.

Features

  • grouping-by(): added inject-mode(aggregate-only)

    This inject mode will drop individual messages that make up the correlation context (key() groups) and would only yield the aggregate messages (e.g. the results of the correlation). (#3998)

  • add-contextual-data(): add support for type propagation, e.g. set the type of name-value pairs as they are created/updated to the value returned by the template expression that we use to set the value.

    The 3rd column in the CSV file (e.g. the template expression) now supports specifying a type-hint, in the format of "type-hint(template-expr)".

    Example line in the CSV database:

    selector-value,name-value-pair-to-be-created,list(foo,bar,baz) (#4051)

  • $(format-json): add --key-delimiter option to reconstruct JSON objects using an alternative structure separator, that was created using the key-delimiter() option of json-parser(). (#4093)

  • json-parser(): add key-delimiter() option to extract JSON structure members into name-value pairs, so that the names are flattened using the character specified, instead of dot.

    Example: Input: {"foo":{"key":"value"}}

    Using json-parser() without key-delimiter() this is extracted to:

      foo.key="value"
    

    Using json-parser(key-delimiter("~")) this is extracted to:

      foo~key="value"
    

    This feature is useful in case the JSON keys contain dots themselves, in those cases the syslog-ng representation is ambigious. (#4093)

Bugfixes

  • Fixed buffer handling of syslog and timestamp parsers (CVE-2022-38725)

    Multiple buffer out-of-bounds issues have been fixed, which could cause hangs, high CPU usage, or other undefined behavior. (#4110)

  • Fixed building with LibreSSL (#4081)

  • network(): Fixed a bug, where syslog-ng halted the input instead of skipping a character in case of a character conversion error. (#4084)

  • redis(): Fixed bug where using redis driver without the batch-lines option caused program crash. (#4114)

  • pdbtool: fix a SIGABRT on FreeBSD that was triggered right before pdbtool exits. Apart from being an ugly crash that produces a core file, functionally the tool behaved correctly and this case does not affect syslog-ng itself. (#4037)

  • regexp-parser(): due to a change introduced in 3.37, named capture groups are stored indirectly in the LogMessage to avoid copying of the value. In this case the name-value pair created with the regexp is only stored as a reference (name + length of the original value), which improves performance and makes such name-value pairs use less memory. One omission in the original change in 3.37 is that syslog-ng does not allow builtin values to be stored indirectly (e.g. $MESSAGE and a few of others) and this case causes an assertion to fail and syslog-ng to crash with a SIGABRT. This abort is now fixed. Here's a sample config that reproduces the issue:

    regexp-parser(patterns('(?<MESSAGE>.*)'));
    

    (#4043)

  • set-tag: fix cloning issue when string literal were used (see #4062) (#4065)

  • add-contextual-data(): fix high memory usage when using large CSV files (#4067)

Other changes

  • The json-c library is no longer bundled in the syslog-ng source tarball

    Since all known OS package managers provide json-c packages nowadays, the json-c submodule has been removed from the source tarball.

    The --with-jsonc=internal option of the configure script has been removed accordingly, system libraries will be used instead. For special cases, the JSON support can be disabled by specifying --with-jsonc=no. (#4078)

  • platforms: Dropped support for ubuntu-impish as it became EOL (#4088)

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Alvin Šipraga, Andras Mitzki, Attila Szakacs, Balazs Scheidler, Bálint Horváth, Daniel Klauer, Fabrice Fontaine, Gabor Nagy, HenryTheSir, László Várady, Parrag Szilárd, Peter Kokai, Shikhar Vashistha, Szilárd Parrag, Vivin Peris

syslog-ng-3.37.1

2 years ago

3.37.1

Highlights

  • kubernetes source: A new source for Kubernetes CRI (Container Runtime Interface) format. By default it tails the /var/log/containers folder which can be overriden with the base-dir() parameter. Example configuration:
    source {
      kubernetes();
      # or specifying the directory:
      # kubernetes(base-dir("/dir/to/tail"));
    };
    
    (#4015)
  • mariadb-audit-parser: A new parser for mariadb/mysql audit plugin logs have been added. The parser supports the syslog output type's format, see mariadb page for details. (#3947)

Features

  • internal(): add rcptid tag to all trace messages that relate to incoming log messages. This makes it easier to correlate parsing, rewriting and routing actions with incoming log messages. (#3972)

  • syslog-parser(): allow comma (e.g. ',') to separate the seconds and the fraction of a second part as some devices use that character. This change applies to both to syslog-parser() and the builtin syslog parsing functionality of network source drivers (e.g. udp(), tcp(), network() and syslog()). (#3949)

  • cisco-parser: add ISO 8601 timestamp support (#3934)

  • network(), syslog() sources and destinations: added new TLS options sigalgs() and client-sigalgs()

    They can be used to restrict which signature/hash pairs can be used in digital signatures. It sets the "signature_algorithms" extension specified in RFC5246 and RFC8446.

    Example configuration:

    destination {
        network("test.host" port(4444) transport(tls)
            tls(
                pkcs12-file("/path/to/tls/test.p12")
                peer-verify(yes)
                sigalgs("RSA-PSS+SHA256:ed25519")
            )
        );
    };
    

    (#4000)

  • set-matches() and unset-matches(): these new rewrite operations allow the setting of match variables ($1, $2, ...) in a single operation, based on a syslog-ng list expression. Example:

    # set $1, $2 and $3 respectively
    set-matches("foo,bar,baz");
    
    # likewise, but using a list function
    set-matches("$(explode ':' 'foo:bar:baz')");
    

    (#3948)

  • $* macro: the $* macro in template expressions convert the match variables (e.g. $1, $2, ...) into a syslog-ng list that can be further manipulated using the list template functions, or turned into a list in type-aware destinations. (#3948)

  • set-tag(): add support for using template expressions in set-tag() rewrite operations, which makes it possible to use tag names that include macro references. (#3962)

Bugfixes

  • http() and other threaded destinations: fix $SEQNUM processing so that only local messages get an associated $SEQNUM, just like normal syslog()-like destinations. This avoids a [meta sequenceId="XXX"] SD-PARAM being added to $SDATA for non-local messages. (#3928)
  • grouping-by(): fix grouping-by() use through parser references. Originally if a grouping-by() was part of a named parser statement and was referenced from multiple log statements, only the first grouping-by() instance behaved properly, 2nd and subsequent references were ignoring all configuration options and have reverted using defaults instead. (#3957)
  • db-parser(): similarly to grouping-by(), db-parser() also had issues propagating some of its options to 2nd and subsequent references of a parser statement. This includes drop-unmatched(), program-template() and template() options. (#3957)
  • match(), subst() and regexp-parser(): fixed storing of numbered (e.g. $1,$2, $3 and so on) and named capture groups in regular expressions in case the input of the regexp is the same as one of the match variables being stored. In some cases the output of the regexp was clobbered and an invalid value stored. (#3948)
  • fix threaded(no) related crash: if threaded mode is disabled for asynchronous sources and destinations (all syslog-like drivers such as tcp/udp/syslog/network qualify), a use-after-free condition can happen due to a reference counting bug in the non-threaded code path. The threaded(yes) setting has been the default since 3.6.1 so if you are using a more recent version, you are most probably unaffected. If you are using threaded(no) a use-after-free condition happens as the connection closes. The problem is more likely to surface on 32 bit platforms due to pointer sizes and struct layouts where this causes a NULL pointer dereference. (#3997)
  • set(): make sure that template formatting options (such as time-zone() or frac-digits()) are propagated to all references of the rewrite rule containing a set(). Previously the clone() operation used to implement multiple references missed the template related options while cloning set(), causing template formatting options to be set differently, depending on where the set() was referenced from. (#3962)
  • csv-parser(): fix flags(strip-whitespace) and null-value handling for greedy column (#4028)

Other changes

  • java()/python() destinations: the $SEQNUM macro (and "seqnum" attribute in Python) was erroneously for both local and non-local logs, while it should have had a value only in case of local logs to match RFC5424 behavior (section 7.3.1). This bug is now fixed, but that means that all non-local logs will have $SEQNUM set to zero from this version on, e.g. the $SEQNUM macro would expand to an string, to match the syslog() driver behaviour. (#3928)
  • dbld: add support for Fedora 35 in favour of Fedora 33 (#3933)
  • debian: fix logrotate file not doing the file rotation. (The path and command was invalid.) (#4031)
  • OpenSSL: add support for OpenSSL 3.0 (#4012)
  • The MD4 hash function ($(md4)) is no longer available when compiling syslog-ng with OpenSSL v3.0. MD4 is now deprecated, it will be removed completely in future versions. (#4012)

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Andras Mitzki, Attila Szakacs, Balazs Scheidler, Ben Burrows, Fᴀʙɪᴇɴ Wᴇʀɴʟɪ, Gabor Nagy, László Várady, mohitvaid, Parrag Szilárd, Peter Kokai, Peter Viskup, Roffild, Ryan Faircloth, Scott Parlane, Zoltan Pallagi

syslog-ng-3.36.1

2 years ago

3.36.1

Highlights

  • system() source: added basic support for reading macOS system logs

    The current implementation processes the output of the original macOS syslogd: /var/log/system.log. (#3710)

  • $(values) and $(names): these new template functions can be used to query a list of name-value pairs in the current message. The list of name value pairs queried are specified by a value-pairs expression, just like with $(format-json).

    Examples:

    This expression sets the JSON array values to contain the list of SDATA values, while the JSON array names would contain the associated names, in the same order.

    $(format-json values=list($(values .SDATA.*)) names=list($(names .SDATA.*)))

    The resulting name-value pairs are always sorted by their key, regardless of the argument order. (#3911)

  • rename(): added a new rewrite rule, called rename()

    Example usage:

    rewrite {
      rename( "renamed-from" "renamed-to" );
    };
    

    (#3841)

Features

  • network() drivers: added TLS keylog support

    syslog-ng dumps TLS secrets for a given source/destination, which can be used for debugging purposes to decrypt data with, for example, Wireshark.

    This should be used for debugging purposes only!

    Example usage:

    source tls_source{
      network(
          port(1234)
          transport("tls"),
          tls(
            key-file("/path/to/server_key.pem"),
            cert-file("/path/to/server_cert.pem"),
            ca-dir("/path/to/ca/")
            keylog-file("/path/to/keylog_file")
          )
      );
    };
    

    (#3792)

  • tls() block: added option for restricting TLS 1.3 ciphers

    The network(), syslog(), and the http() modules now support specifying TLS 1.3 cipher suites,

    Example usage:

    network(
      transport("tls")
      tls(
        pkcs12-file("test.p12")
        cipher-suite(
          tls12-and-older("ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256"),
          tls13("TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384")
        )
      )
    );
    

    tls12-and-older() can be used to specify TLS v1.2-and-older ciphers, tls13() can be used for TLS v1.3 ciphers only.

    Note: The old cipher-suite("list:of:ciphers") option restricts only the TLS v1.2-and-older cipher suite for backward compatibility. (#3907)

  • file() destination: added a new option: symlink-as()

    This feature allows one to maintain a persistent symlink to a log file when a template is used (for example: /var/log/cron -> /var/log/cron.${YEAR}${MONTH}).

    Example usage:

    destination d_file_cron {
      file("/var/log/cron.${YEAR}${MONTH}" symlink-as("/var/log/cron"));
    };
    

    From a functional perspective, the symlink-as file inherits both create-dirs and file ownership from its file destination (permissions are not applicable to symlinks, at least on linux).

    The symlink is adjusted at the time a new destination file is opened (in the example above, if ${YEAR} or ${MONTH} changes).

    Although not specific to time macros, that's where the usefulness is. If the template contains something like ${PROGRAM} or ${HOST}, the configuration wouldn't necessarily be invalid, but you'd get an ever-changing symlink of dubious usefulness. (#3855)

  • flags(no-rfc3164-fallback): added a new flag to sources that parse incoming syslog data and operate in RFC5424 mode (e.g. syslog-protocol is also set). With the new flag the automatic fallback to RFC3164 format is disabled. In this case if the parsing in RFC5424 fails, the syslog parser would result in an error message. In the case of syslog-parser(drop-invalid(yes)), the message would be dropped. (#3891)

  • syslog-format: accept ISO timestamps that incorrectly use a space instead of a 'T' to delimit the date from the time portion. For example, a "2021-01-01T12:12:12" timestamp is well formed according to RFC5424 (which uses a subset of ISO8601, see https://datatracker.ietf.org/doc/html/rfc5424#section-6.2.3). Some systems simply use a space instead of a 'T'. The same format is accepted for both RFC3164 (e.g. udp(), tcp() and network() sources) and RFC5424 (e.g. syslog() source). (#3893)

  • transport(text-with-nuls): added a new transport mechanism for the network() driver that allows NUL characters within the message.

    Note: syslog-ng does not support embedded NUL characters everywhere, so it is recommended that you also use flags(no-multi-line) that causes NUL characters to be replaced by space. (#3913)

Bugfixes

  • filter: fixed the not operator in filter expressions (regression in v3.35.1)

    Reusing a filter that contains the not operator more than once, or referencing a complex expression containing not might have caused invalid results in the previous syslog-ng version (v3.35.1). This has been fixed. (#3863)

  • throttle() filter: support negation (#3863)

  • disk-buffer(): fixed a crash which could happen in very rare cases, while a corrupted disk-buffer was getting replaced (#3845)

  • disk-buffer(): fixed a memory leak issue and inconsistent buffer handling in rare cases (#3887)

  • disk-buffer(): fixed underflowing queued stats counter (#3887)

  • disk-buffer(): fixed queued stats were not adjusted when a disk-buffer became corrupt (#3851)

  • disk-buffer(): fixed a disk-buffer corruption issue

    A completely filled and then emptied disk-buffer may have been recognised as corrupt. (#3874)

  • amqp(): fixed a minor error reporting problem. (#3869)

  • amqp(): syslog-ng now drops messages that are too large to send (#3869)

  • amqp(): fixed a crash, which happened with librabbitmq v0.9.0 or v0.10.0, while using the tls() block. (#3929)

  • file() source: fixed invalid buffer handling when encoding() is used

    A bug has been fixed that - under rare circumstances - could cause message duplication or partial message loss when non-fixed length or less known fixed-length encodings are used. (#3892)

  • syslog-ng: fixed a SIGSEGV triggered by an incorrectly formatted "CONFIG" command, received on the syslog-ng control socket. The only known implementation of the control protocol is syslog-ng-ctl itself, which always sends a correct command, but anyone with access to the UNIX domain socket syslog-ng.ctl (root only by default) can trigger a crash. (#3900)

  • credit-card-mask(): fixed visa, mastercard and jcb card regex pattern (#3853)

  • cisco-parser(): allow a leading dot in the timestamp (not synced clocks) (#3843)

Notes to developers

  • plugins: we have made it easier to implement filter plugins

    An example can be found under modules/rate-limit-filter. (#3866)

  • dev-utils: various fixes for the plugin skeleton generator script (#3866)

Other changes

  • The syslog-ng Docker image is now automatically tagged and pushed to Docker Hub after each release (#3870)
  • throttle() filter: renamed to rate-limit() (#3866)
  • python: support Python 3.10 (#3865)
  • java: upgraded from old log4j v1.x line to log4j v2.17.2 (#3861) (#3927)

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Andras Mitzki, Andrea Biardi, Attila Szakacs, Balazs Scheidler, Balázs Barkó, Benedek Cserhati, Gabor Nagy, Janos SZIGETVARI, Laszlo Budai, Laszlo Szemere, László Várady, Mikel Olasagasti Uranga, Norbert Takacs, Parrag Szilárd, Peter Kokai, Szilárd Parrag, Zoltan Pallagi, Stanislav Osipov, Yash Mathne

syslog-ng-3.35.1

2 years ago

3.35.1

syslog-ng OSE APT repository

From now on, Ubuntu and Debian packages will be published with every syslog-ng release in the form of an APT repository.

We, syslog-ng developers, provide these packages and the APT repository "as is" without warranty of any kind, on a best-effort level.

Currently, syslog-ng packages are released for the following distribution versions (x86-64):

  • Debian: bullseye, buster, stretch, sid, testing
  • Ubuntu: Impish, Focal, Bionic, Xenial

For instructions on how to install syslog-ng on Debian/Ubuntu distributions, see the README.

Highlights

  • throttle(): added a new filter that allows rate limiting messages based on arbitrary keys in each message. Note: messages over the rate limit are dropped (just like in any other filter).

    filter f_throttle {
      throttle(
        template("$HOST")
        rate(5000)
      );
    };
    

    (#3781)

  • mqtt(): added a new source that can be used to receive messages using the MQTT protocol. Supported transports: tcp, ws, ssl, wss

    Example config:

    source {
        mqtt{
            topic("sub1"),
            address("tcp://localhost:4445")
        };
    };
    

    (#3809)

Features

  • afsocket: Socket options, such as ip-ttl() or tcp-keepalive-time(), are traditionally named by their identifier defined in socket(7) and unix(7) man pages. This was not the case with the pass-unix-credentials() option, which - unlike other similar options - was also possible to set globally.

    A new option called so-passcred() is now introduced, which works similarly how other socket related options do, which also made possible a nice code cleanup in the related code sections. Of course the old name remains supported in compatibility modes.

    The PR also implements a new source flag ignore-aux-data, which causes syslog-ng not to propagate transport-level auxiliary information to log messages. Auxiliary information includes for example the pid/uid of the sending process in the case of UNIX based transports, OR the X.509 certificate information in case of SSL/TLS encrypted data streams.

    By setting flags(ignore-aux-data) one can improve performance at the cost of making this information unavailable in the log messages received through affected sources. (#3670)

  • network: add support for PROXY header before TLS payload

    This new transport method called proxied-tls-passthrough is capable of detecting the PROXY header before the TLS payload. Loggen has been updated with the--proxied-tls-passthrough option for testing purposes.

    source s_proxied_tls_passthrough{
      network(
        port(1234)
        transport("proxied-tls-passthrough"),
        tls(
          key-file("/path/to/server_key.pem"),
          cert-file("/path/to/server_cert.pem"),
          ca-dir("/path/to/ca/")
        )
      );
    };
    

    (#3770)

  • mqtt() destination: added client-id option. It specifies the unique client ID sent to the broker. (#3809)

Bugfixes

  • unset(), groupunset(): fix unwanted removal of values on different log paths

    Due to a copy-on-write bug, unset() and groupunset() not only removed values from the appropriate log paths, but from all the others where the same message went through. This has been fixed. (#3803)

  • regexp-parser(): fix storing unnamed capture groups under prefix() (#3810)

  • loggen: cannot detect plugins on platforms with non .so shared libs (osx) (#3832)

Packaging

  • debian/control: Added libcriterion-dev as a build dependency, where it is available from APT. (debian-bullseye, debian-testing, debian-sid) (#3794)

  • centos-7: kafka and mqtt modules are now packaged.

    The following packages are used as dependencies:

    • librdkafka-devel from EPEL 7
    • paho-c-devel from copr:copr.fedorainfracloud.org:czanik:syslog-ng-githead (#3797)
  • debian: Added bullseye support. (#3794)

  • bison: support build with bison 3.8 (#3784)

Notes to developers

  • dbld: As new distributions use python3 by default it makes sense to explicitly state older platforms which use python2 instead of the other way around, so it is not necessary to add that new platform to the python3 case. (#3780)

  • dbld: move dbld image cache from DockerHub to GitHub

    In 2021, GitHub introduced the GitHub Packages service. Among other repositories - it provides a standard Docker registry. DBLD uses this registry, to avoid unnecessary rebuilding of the images. (#3782)

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Andras Mitzki, Antal Nemes, Attila Szakacs, Balazs Scheidler, Balázs Barkó, Benedek Cserhati, Colin Douch, Gabor Nagy, Laszlo Szemere, László Várady, Norbert Takacs, Parrag Szilárd, Peter Czanik (CzP), Peter Kokai, Robert Paschedag, Ryan Faircloth, Szilárd Parrag, Thomas Klausner, Zoltan Pallagi

syslog-ng-3.34.1

2 years ago

3.34.1

Highlights

  • regexp-parser(): new parser that can parse messages with regular expressions

    Example:

    regexp-parser(
      template("${MESSAGE}")
      prefix(".regexp.")
      patterns("(?<DN>foo)", "(?<DN>ball)")
    );
    

    regexp-parser() can be used as an intuitive replacement for regexp filters that had their store-matches flag set in order to save those matches.

    (#3702)

  • redis(): workers() and batching support

    The Redis driver now support the workers() option, which specifies the number of parallel workers, and the batch-lines() option.

    This could drastically increase the throughput of the Redis destination driver.

    Example:

    redis(
        host("localhost")
        port(6379)
        command("HINCRBY", "hosts", "$HOST", "1")
        workers(8)
        batch-lines(100)
        batch-timeout(10000)
        log-fifo-size(100000)
    );
    

    (#3732, #3745)

  • mqtt(): TLS and WebSocket Secure support

    The MQTT destination now supports TLS and WSS.

    Example config:

    mqtt(
      address("ssl://localhost:8883")
      topic("syslog/$HOST")
      fallback-topic("syslog/fallback")
    
      tls(
        ca-file("/path/to/ca.crt")
        key-file("/path/to/client.key")
        cert-file("/path/to/client.crt")
        peer-verify(yes)
      )
    );
    

    (#3747)

Features

  • system() source: added support for NetBSD (#3761)

  • stats: new statistics counter

    The following statistics are now available for the HTTP destination, and other file and network based sources/destinations:

    • msg_size_max/msg_size_avg: Shows the largest/average message size of the given source/destination that has been measured so far.

    • batch_size_max/batch_size_avg: When batching is enabled, then this shows the largest/average batch size of the given source/destination that has been measured so far.

    • eps_last_1h, eps_last_24h, eps_since_start: Events per second, measured for the last hour, for the last 24 hours, and since syslog-ng startup, respectively.

    Notes:

    • Message sizes are calculated from the incoming raw message length on the source side, and from the outgoing formatted message length on the destination side.
    • EPS counters are just approximate values, they are updated every minute. (#3753)
  • mqtt(): username/password authentication

    Example config:

    mqtt(
      address("tcp://localhost:1883")
      topic("syslog/messages")
      username("user")
      password("passwd")
    );
    

    Note: The password is transmitted in cleartext without using ssl:// or wss://. (#3747)

  • mqtt(): new option http-proxy() for specifying HTTP/HTTPS proxy for WebSocket connections (#3747)

  • syslog-ng-ctl: new flag for pruning statistics

    syslog-ng-ctl stats --remove-orphans can be used to remove "orphaned" statistic counters. It is useful when, for example, a templated file destination ($YEAR.$MONTH.$DAY) produces a lot of stats, and one wants to remove those abandoned counters occasionally/conditionally. (#3760)

  • disk-buffer(): added a new option to reliable disk-buffer: qout-size().

    This option sets the number of messages that are stored in the memory in addition to storing them on disk. The default value is 1000.

    This serves performance purposes and offers the same no-message-loss guarantees as before.

    It can be used to maintain a higher throughput when only a small number of messages are waiting in the disk-buffer. (#3754)

Bugfixes

  • network(), syslog(): fixed network sources on NetBSD

    On NetBSD, TCP-based network sources closed their listeners shortly after startup due to a non-portable TCP keepalive setting. This has been fixed. (#3751)

  • disk-buffer(): fixed a very rare case, where the reliable disk-buffer never resumed after triggering flow-control. (#3752)

  • disk-buffer(): fixed a rare memory leak that occurred when mem-buf-length() or mem-buf-size() was configured incorrectly (#3750)

  • redis(): fixed command errors that were not detected and marked as successful delivery (#3748)

Notes to developers

  • Light framework: new proxy-related options are supported with loggen: --proxy-src-ip, --proxy-dst-ip, --proxy-src-port, --proxy-dst-port (#3766)

  • log-threaded-dest: descendant drivers from LogThreadedDest no longer inherit batch-lines() and batch-timeout() automatically. Each driver have to opt-in for these options with log_threaded_dest_driver_batch_option.

    log_threaded_dest_driver_option has been renamed to log_threaded_dest_driver_general_option, and log_threaded_dest_driver_workers_option have been added similarly to the batch-related options. (#3741)

Other changes

  • disk-buffer(): performance improvements

    Based on our measurements, the following can be expected compared to the previous syslog-ng release (v3.33.1):

    • non-reliable disk buffer: up to 50% performance gain;
    • reliable disk buffer: up to 80% increase in performance.

    (#3743, #3746, #3754, #3756, #3757)

  • disk-buffer(): the default value of the following options has been changed for performance reasons:

    • truncate-size-ratio(): from 0.01 to 0.1 (from 1% to 10%)
    • qout-size(): from 64 to 1000 (this affects only the non-reliable disk buffer) (#3757)
  • kafka-c(): properties-file() option is removed

    Please list librdkafka properties in the config() option in syslog-ng's configuration. See librdkafka configuration here. (#3704)

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Andras Mitzki, Attila Szakacs, Balazs Scheidler, Balázs Barkó, Benedek Cserhati, Fabrice Fontaine, Gabor Nagy, Laszlo Szemere, LittleFish33, László Várady, Norbert Takacs, Parrag Szilárd, Peter Czanik, Peter Kokai, Zoltan Pallagi

syslog-ng-3.33.2

2 years ago

3.33.2

Bugfixes

  • disk-buffer: fixed a bug, which was introduced in 3.33.1, where we sometimes corrupted the disk-buffer file when it reached full size. (#3726)

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Andras Mitzki, Antal Nemes, Attila Szakacs, Balázs Barkó, Balazs Scheidler, Benedek Cserhati, Gabor Nagy, Josef Schlehofer, Laszlo Budai, Laszlo Szemere, László Várady, Norbert Takacs, Parrag Szilárd, Peter Kokai, Zoltan Pallagi

syslog-ng-3.33.1

2 years ago

3.33.1

Highlights

  • MQTT destination

    The new mqtt() destination can be used to publish messages using the MQTT protocol. Currently MQTT 3.1.1 and 3.1 are supported.

    Supported transports: tcp, ws.

    Example config:

    destination {
      mqtt(
        address("tcp://localhost:1883"),
        topic("syslog/$HOST"),
        fallback-topic("syslog/fallback")
      );
    };
    

    Note: MQTT 5.0 and TLS (ssl://, wss://) are currently not supported. (#3703)

  • discord() destination

    syslog-ng now has a webhook-based Discord destination. Example usage:

    destination {
      discord(url("https://discord.com/api/webhooks/x/y"));
    };
    

    The following options can be used to customize the destination further:

    avatar-url(), username("$HOST-bot"), tts(true), template("${MSG:-[empty message]}"). (#3717)

Features

  • kafka-c: batching support in case of sync-send(yes)

    kafka-c(
     bootstrap-server("localhost:9092")
     topic("syslog-ng")
     sync-send(yes)
     batch-lines(10)
     batch-timeout(10000)
    );
    

    Note1: batch-lines are accepted in case of sync-send(no), but no batching is done. Note2: messages are still sent one at a time to kafka, the batch yields multiple message per transaction. (#3699)

  • kafka-c: sync-send(yes) enables synchronous message delivery, reducing the possibility of message loss.

    kafka-c(
      bootstrap-server("localhost:9092")
      topic("syslog-ng")
      sync-send(yes)
    );
    

    Warning: this option also reduces significantly the performance of kafka-c driver. (#3681)

  • disk-buffer: Now we optimize the file truncating frequency of disk-buffer.

    The new behavior saves IO time, but loses some disk space, which is configurable with a new option. The new option in the config is settable at 2 places:

    • truncate-size-ratio() in the disk-buffer() block, which affects the given disk-buffer.
    • disk-buffer(truncate-size-ratio()) in the global options block, which affects every disk-buffer which did not set truncate-size-ratio() itself. The default value is 0.01, which operates well with most disk-buffers.

    If the possible size reduction of the truncation does not reach truncate-size-ratio() x disk-buf-size(), we do not truncate the disk-buffer.

    To completely turn off truncating (maximal disk space loss, maximal IO time saved) set truncate-size-ratio(1), or to mimic the old behavior (minimal disk space loss, minimal IO time saved) set truncate-size-ratio(0). (#3689)

Bugfixes

  • syslog-format: fixing the check-hostname(yes|no) option

    The check-hostname(yes|no) option detected every value as invalid, causing a parse error when enabled. (#3690)

  • disk-buffer(): fix crash when switching between disk-based and memory queues

    When a disk-buffer was removed from the configuration and the new config was applied by reloading syslog-ng, a crash occurred. (#3700)

  • logpath: Fixed a message write protection bug, where message modifications (rewrite rules, parsers, etc.) leaked through preceding path elements. This may have resulted not only in unwanted/undefined message modification, but in certain cases crash as well. (#3708)

  • mongodb(): fix crash with older mongo-c-driver versions

    syslog-ng crashed (was aborted) when the mongodb() destination was used with older mongo-c-driver versions (< v1.11.0). (#3677)

  • java(): fix debug logging of Java-based destinations

    Java debug logging was not enabled previously when syslog-ng was started in debug/trace mode. This has been fixed. (#3679)

  • kafka-c: fixed a hang during shutdown/reload, when multiple workers is used (workers() option is set to 2 or higher) and the librdkafka internal queue is filled. (error message was kafka: failed to publish message; topic='test-topic', error='Local: Queue full') (#3711)

Packaging

  • kafka: minimum version of librdkafka is changed from 1.0.0 to 1.1.0 (#3706)
  • configure: now supporting python with two digit minor version (#3713)

Other changes

  • kafka: removed some deprecated options: client-lib-dir(), option(), template(), kafka-bootstrap-servers() (#3698)
  • kafka: properties-file() option is deprecated. Please list the librdkafka properties in the config() option in syslog-ng's configuration. (#3698)
  • smtp(): libesmtp is now detected via pkg-config (#3669)

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Andras Mitzki, Antal Nemes, Attila Szakacs, Balazs Scheidler, Balázs Barkó, Benedek Cserhati, Gabor Nagy, L4rS6, Laszlo Budai, Laszlo Szemere, LittleFish33, László Várady, Norbert Takacs, Peter Czanik, Peter Kokai, Todd C. Miller, Tomáš Mózes, Zoltan Pallagi

syslog-ng-3.32.1

3 years ago

3.32.1

Highlights

  • mongodb(): add workers() support (multi-threaded connection pooling)

    The MongoDB driver now supports the workers() option, which specifies the number of parallel workers to be used. Workers are based on the connection pooling feature of the MongoDB C library.

    This increases the throughput of the MongoDB destination driver.

    Example:

    destination {
      mongodb(
        uri("mongodb://hostA,hostB/syslog?replicaSet=my_rs&wtimeoutMS=10000&socketTimeoutMS=10000&connectTimeoutMS=10000&serverSelectionTimeoutMS=5000")
        collection("messages")
        workers(8)
      );
    };
    

    (#3621)

  • mongodb(): template support for the collection() option

    The collection() option of the MongoDB destination driver now accepts templates, for example:

    destination {
      mongodb(
        uri("mongodb://host/syslog")
        collection("${HOST}_messages")
      );
    };
    

    (#3621)

Features

  • time-reopen: Support the time-reopen() option on the driver level for the following drivers:
    • sources: example-diskq-source, python-fetcher
    • destinations: amqp, example-destination, file, http, mongodb, network, pipe, program, pseudofile, python, redis, riemann, smtp, sql, stomp, syslog, tcp, tcp6, udp, udp6, unix-dgram, unix-stream, usertty (#3585)
  • csv-parser(): add drop-invalid() option along with the already existing flag with the same name. This is to improve the consistency of the configuration language. (#3547)
  • usertty() destination: Support changing the terminal disable timeout with the time-reopen() option. Default timeout change to 60 from 600. If you wish to use the old 600 timeout, add time-reopen(600) to your config in the usertty() driver. (#3585)
  • syslog-parser(): add a new drop-invalid() option that allows the use of syslog-parser() in if statements. Normally a syslog-parser() injects an error message instead of failing. (#3565)

Bugfixes

  • date-parser: if the timestamp pattern did not covered a field (for example seconds) that field had undefined value

    The missing fields are initialized according to the following rules:

    1. missing all fields -> use current date
    2. only miss year -> guess year based on current year and month (current year, last year or next year)
    3. the rest of the cases don't make much sense, so zero initialization of the missing field makes sense. And the year is initialized to the current one. (#3615)
  • Fix compilation issues on OpenBSD

    syslog-ng can now be compiled on OpenBSD. (#3661)

  • loggen: debug message printed wrong plugin name (ssl-plugin instead of socket_plugin) (#3624)

  • tls: fixup EOF detection issue in tls (before 3.0 version)

    syslog-ng error message: "I/O error occurred while reading; fd='13', error='Success (0)'" (#3618)

  • kafka: the config() block couldn't contain option that is already a keyword in syslog-ng (example: retries) (#3658)

  • templates: fixed error reporting when invalid templates were specified

    The amqp(), file() destination, sql(), stomp(), pdbtool, and graphite() plugins had template options that did not report errors at startup when invalid values were specified. (#3660)

Packaging

  • bison: minimum version of bison is bumped to 3.7.6 (#3547)
  • java-modules: the minimum version of gradle changed from 2.2 to 3.4 (#3645)
  • light: add to the release tarball (#3613)

Credits

syslog-ng is developed as a community project, and as such it relies on volunteers, to do the work necessarily to produce syslog-ng.

Reporting bugs, testing changes, writing code or simply providing feedback are all important contributions, so please if you are a user of syslog-ng, contribute.

We would like to thank the following people for their contribution:

Andras Mitzki, Attila Szakacs, Balazs Scheidler, Gabor Nagy, Janos SZIGETVARI, Laszlo Budai, Laszlo Szemere, LittleFish33, László Várady, Ming Liu, Norbert Takacs, Peter Kokai, Todd C. Miller, Yi Fan Yu, Zoltan Pallagi