<div dir="ltr"><div class="gmail-markdown-body gmail-my-3">Dear syslog-ng users,<br><br><div>We are pleased to announce the 4.3.1 version of syslog-ng, which has been released and is now available on GitHub:</div><div><br></div><div><a href="https://github.com/syslog-ng/syslog-ng/releases/tag/syslog-ng-4.3.1">https://github.com/syslog-ng/syslog-ng/releases/tag/syslog-ng-4.3.1</a></div><div><br></div><div><a href="https://github.com/syslog-ng/syslog-ng#installation-from-binaries" target="_blank" rel="noopener"><span>Packages</span></a><span> are also available for various platforms.</span></div><div><span><br></span></div><div><span>The AxoSyslog project provides</span><a href="https://axoflow.com/cloud-ready-syslog-ng-images/" target="_blank" rel="noopener"> <span>cloud-ready container images</span></a>,<a href="https://axoflow.com/axosyslog-log-collection-for-kubernetes/" target="_blank" rel="noopener"> <span>Helm charts</span></a>, and open-source documentation at the link below:<br></div><div><span><br></span></div><div><a href="https://axoflow.com/docs/axosyslog-core/">https://axoflow.com/docs/axosyslog-core/</a></div></div><div class="gmail-markdown-body gmail-my-3"><h1>4.3.1</h1>
<p><em>This is the combination of the news entries of 4.3.0 and 4.3.1. 4.3.1 hotfixed</em><br>
<em>a <code>python-parser()</code> related crash and a metrics related memory leak. It also</em><br>
<em>added Ubuntu 23.04 and Debian 12 support for APT packages and the <code>opensearch()</code></em><br>
<em>destination.</em></p>
<p>Read Axoflow's <a href="https://axoflow.com/axosyslog-release-4-3/" rel="nofollow">blog post</a> for more details.</p>
<h2>Highlights</h2>
<h4><code>parallelize()</code> support for pipelines</h4>
<p>syslog-ng has traditionally performed processing of log messages arriving<br>
from a single connection sequentially. This was done to ensure message ordering<br>
as well as most efficient use of CPU on a per message basis. This mode of<br>
operation is performing well as long as we have a relatively large number<br>
of parallel connections, in which case syslog-ng would use all the CPU cores<br>
available in the system.</p>
<p>In case only a small number of connections deliver a large number of<br>
messages, this behaviour may become a bottleneck.</p>
<p>With the new parallelization feature, syslog-ng gained the ability to<br>
re-partition a stream of incoming messages into a set of partitions, each of<br>
which is to be processed by multiple threads in parallel. This does away<br>
with ordering guarantees and adds an extra per-message overhead. In exchange<br>
it will be able to scale the incoming load to all CPUs in the system, even<br>
if coming from a single, chatty sender.</p>
<p>To enable this mode of execution, use the new parallelize() element in your<br>
log path:</p>
<div class="gmail-snippet-clipboard-content gmail-notranslate gmail-position-relative gmail-overflow-auto"><pre class="gmail-notranslate"><code>log {
source {
tcp(
port(2000)
log-iw-size(10M) max-connections(10) log-fetch-limit(100000)
);
};
parallelize(partitions(4));
# from this part on, messages are processed in parallel even if
# messages are originally coming from a single connection
parser { ... };
destination { ... };
};
</code></pre></div>
<p>The config above will take all messages emitted by the tcp() source and push<br>
the work to 4 parallel threads of execution, regardless of how many<br>
connections were in use to deliver the stream of messages to the tcp()<br>
driver.</p>
<p>parallelize() uses round-robin to allocate messages to partitions by default.<br>
You can however retain ordering for a subset of messages with the<br>
partition-key() option.</p>
<p>You can use partition-key() to specify a message template. Messages that<br>
expand to the same value are guaranteed to be mapped to the same partition.</p>
<p>For example:</p>
<div class="gmail-snippet-clipboard-content gmail-notranslate gmail-position-relative gmail-overflow-auto"><pre class="gmail-notranslate"><code>log {
source {
tcp(
port(2000)
log-iw-size(10M) max-connections(10) log-fetch-limit(100000)
);
};
parallelize(partitions(4) partition-key("$HOST"));
# from this part on, messages are processed in parallel if their
# $HOST value differs. Messages with the same $HOST will be mapped
# to the same partition and are processed sequentially.
parser { ... };
destination { ... };
};
</code></pre></div>
<p>NOTE: parallelize() requires a patched version of libivykis that contains<br>
this PR <a class="gmail-issue-link gmail-js-issue-link" href="https://github.com/buytenh/ivykis/pull/25">buytenh/ivykis#25</a>. syslog-ng source<br>
releases bundle this version of ivykis in their source trees, so if you are<br>
building from source, be sure to use the internal version<br>
(--with-ivykis=internal). You can also use Axoflow's cloud native container<br>
image for syslog-ng, named AxoSyslog<br>
(<a href="https://github.com/axoflow/axosyslog-docker">https://github.com/axoflow/axosyslog-docker</a>) which also incorporates this<br>
change.</p>
<p>(<a href="https://github.com/syslog-ng/syslog-ng/pull/3966">#3966</a>)</p>
<h4>Receiving and sending OpenTelemetry (OTLP) messages</h4>
<p>The <code>opentelemetry()</code> source, parser and destination are now available to receive, parse and send <strong>OTLP/gRPC</strong><br>
messages.</p>
<p>syslog-ng accepts <a href="https://github.com/open-telemetry/opentelemetry-proto/blob/v0.20.0/opentelemetry/proto/logs/v1/logs.proto">logs</a>, <a href="https://github.com/open-telemetry/opentelemetry-proto/blob/v0.20.0/opentelemetry/proto/metrics/v1/metrics.proto">metrics</a> and <a href="https://github.com/open-telemetry/opentelemetry-proto/blob/v0.20.0/opentelemetry/proto/trace/v1/trace.proto">traces</a>.</p>
<p>The incoming fields are not available through syslog-ng log message name-value pairs for the user by default.<br>
This is useful for forwarding functionality (the <code>opentelemetry()</code> destination can access and format them).<br>
If such functionality is required, you can configure the <code>opentelemetry()</code> parser, which maps all the fields<br>
with some limitations.</p>
<p>The behavior of the <code>opentelemetry()</code> parser is the following:</p>
<p>The name-value pairs always start with <code>.otel.</code> prefix. The type of the message is stored in <code>.otel.type</code><br>
(possible values: <code>log</code>, <code>metric</code> and <code>span</code>). The <code>resource</code> info is mapped to <code>.otel.resource.<...></code><br>
(e.g.: <code>.otel.resource.dropped_attributes_count</code>, <code>.otel.resource.schema_url</code> ...), the <code>scope</code> info<br>
is mapped to <code>.otel.scope.<...></code> (e.g.: <code>.<a href="http://otel.scope.name">otel.scope.name</a></code>, <code>.otel.scope.schema_url</code>, ...).</p>
<p>The fields of log records are mapped to <code>.otel.log.<...></code> (e.g. <code>.otel.log.body</code>, <code> .otel.log.severity_text</code>, ...).</p>
<p>The fields of metrics are mapped to <code>.otel.metric.<...></code> (e.g. <code>.<a href="http://otel.metric.name">otel.metric.name</a></code>, <code>.otel.metric.unit</code>, ...),<br>
the type of the metric is mapped to <code>.otel.metric.data.type</code> (possible values: <code>gauge</code>, <code>sum</code>, <code>histogram</code>,<br>
<code>exponential_histogram</code>, <code>summary</code>) with the actual data mapped to <code>.otel.metric.data.<type>.<...></code><br>
(e.g.: <code>.otel.metric.data.gauge.data_points.0.time_unix_nano</code>, ...).</p>
<p>The fields of traces are mapped to <code>.otel.span.<...></code> (e.g. <code>.<a href="http://otel.span.name">otel.span.name</a></code>, <code>.otel.span.trace_state</code>, ...).</p>
<p><code>repeated</code> fields are given an index (e.g. <code>.otel.span.events.5.time_unix_nano</code>).</p>
<p>The mapping of <a href="https://github.com/open-telemetry/opentelemetry-proto/blob/v0.20.0/opentelemetry/proto/common/v1/common.proto#L28"><code>AnyValue</code></a> type fields is limited.<br>
<code>string</code>, <code>bool</code>, <code>int64</code>, <code>double</code> and <code>bytes</code> values are mapped with the respective syslog-ng name-value type<br>
(e.g. <code>.otel.resource.attributes.string_key</code> => <code>string_value</code>), however <code>ArrayValue</code> and <code>KeyValueList</code> types<br>
are stored serialized with <code>protobuf</code> type. <code>protobuf</code> and <code>bytes</code> types are not directly available for the<br>
user, unless an explicit type cast is added (e.g. <code>"bytes(${.otel.log.span_id})"</code>) or <code>--include-bytes</code> is passed<br>
to name-value iterating template functions (e.g. <code>$(format-json .otel.* --include-bytes)</code>, which will base64<br>
encode the bytes content).</p>
<p>Three authentication methods are available in the source <code>auth()</code> block: <code>insecure()</code> (default), <code>tls()</code> and <code>alts()</code>.<br>
<code>tls()</code> accepts the <code>key-file()</code>, <code>cert-file()</code>, <code>ca-file()</code> and <code>peer-verify()</code> (possible values:<br>
<code>required-trusted</code>, <code>required-untrusted</code>, <code>optional-trusted</code> and <code>optional-untrusted</code>) options.<br>
<a href="https://grpc.io/docs/languages/cpp/alts/" rel="nofollow">ALTS</a> is a simple to use authentication, only available within Google's infrastructure.</p>
<p>The same methods are available in the destination <code>auth()</code> block, with two differences: <code>tls(peer-verify())</code><br>
is not available, and there is a fourth method, called <a href="https://cloud.google.com/docs/authentication/application-default-credentials" rel="nofollow">ADC</a>, which accepts the <code>target-service-account()</code><br>
option, where a list of service accounts can be configured to match against when authenticating the server.</p>
<p>Example configs:</p>
<div class="gmail-snippet-clipboard-content gmail-notranslate gmail-position-relative gmail-overflow-auto"><pre class="gmail-notranslate"><code>log otel_forward_mode_alts {
source {
opentelemetry(
port(12345)
auth(alts())
);
};
destination {
opentelemetry(
url("my-otel-server:12345")
auth(alts())
);
};
};
log otel_to_non_otel_insecure {
source {
opentelemetry(
port(12345)
);
};
parser {
opentelemetry();
};
destination {
network(
"my-network-server"
port(12345)
template("$(format-json .otel.* --shift-levels 1 --include-bytes)\n")
);
};
};
log non_otel_to_otel_tls {
source {
network(
port(12346)
);
};
destination {
opentelemetry(
url("my-otel-server:12346")
auth(
tls(
ca-file("/path/to/ca.pem")
key-file("/path/to/key.pem")
cert-file("/path/to/cert.pem")
)
)
);
};
};
</code></pre></div>
<p>(<a href="https://github.com/syslog-ng/syslog-ng/pull/4523">#4523</a>)<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4510">#4510</a>)</p>
<h4>Sending messages to CrowdStrike Falcon LogScale (Humio)</h4>
<p>The <code>logscale()</code> destination feeds LogScale via the <a href="https://library.humio.com/falcon-logscale/api-ingest.html#api-ingest-structured-data" rel="nofollow">Ingest API</a>.</p>
<p>Minimal config:</p>
<div class="gmail-snippet-clipboard-content gmail-notranslate gmail-position-relative gmail-overflow-auto"><pre class="gmail-notranslate"><code>destination d_logscale {
logscale(
token("my-token")
);
};
</code></pre></div>
<p>Additional options include:</p>
<ul><li><code>url()</code></li><li><code>rawstring()</code></li><li><code>timestamp()</code></li><li><code>timezone()</code></li><li><code>attributes()</code></li><li><code>extra-headers()</code></li><li><code>content-type()</code></li></ul>
<p>(<a href="https://github.com/syslog-ng/syslog-ng/pull/4472">#4472</a>)</p>
<h2>Features</h2>
<ul><li>
<p><code>afmongodb</code>: Bulk MongoDB insert is added via the following options</p>
<ul><li><code>bulk</code> (<strong>yes</strong>/no) turns on/off <a href="http://mongoc.org/libmongoc/current/bulk.html" rel="nofollow">bulk insert </a>usage, <code>no</code> forces the old behavior (each log is inserted one by one into the MongoDB)</li><li><code>bulk_unordered</code> (yes/<strong>no</strong>) turns on/off <a href="http://mongoc.org/libmongoc/current/bulk.html#unordered-bulk-write-operations" rel="nofollow">unordered MongoDB bulk operations</a></li><li><code>bulk_bypass_validation</code> (yes/<strong>no</strong>) turns on/off <a href="http://mongoc.org/libmongoc/1.23.3/bulk.html#bulk-operation-bypassing-document-validation" rel="nofollow">MongoDB bulk operations validation</a></li><li><code>write_concern</code> (unacked/<strong>acked</strong>/majority/n > 0) sets <a href="http://mongoc.org/libmongoc/1.23.3/bulk.html#bulk-operation-write-concerns" rel="nofollow">write concern mode of the MongoDB operations</a>, both bulk and single</li></ul>
<p>NOTE: Bulk sending is only efficient if the used collection is
constant (e.g. not using templates) or the used template does not lead
to too many collections switching within a reasonable time range.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4483">#4483</a>)</p>
</li><li>
<p><code>sql</code>: Added 2 new options</p>
<ul><li><code>quote_char</code> to aid custom quoting for table and index names (e.g. MySQL needs sometimes this for certain identifiers)<br>
<strong>NOTE</strong>: Using a back-tick character needs a special
formatting as syslog-ng uses it for configuration parameter names, so
for that use: <code>quote_char("``")</code> (double back-tick)</li><li><code>dbi_driver_dir</code> to define an optional DBI driver location for DBD initialization</li></ul>
<p>NOTE: libdbi and libdbi-drivers OSE forks are updated, <code>afsql</code> now should work nicely both on ARM and X86 macOS systems too (tested on macOS 13.3.1 and 12.6.4)</p>
<p>Please do not use the pre-built ones (e.g. 0.9.0 from Homebrew), build from the <strong>master</strong> of the following</p>
<ul><li><a href="https://github.com/balabit-deps/libdbi-drivers">https://github.com/balabit-deps/libdbi-drivers</a></li><li><a href="https://github.com/balabit-deps/libdbi">https://github.com/balabit-deps/libdbi</a></li></ul>
<p>(<a href="https://github.com/syslog-ng/syslog-ng/pull/4460">#4460</a>)</p>
</li><li>
<p><code>opensearch</code>: Added a new destination.</p>
<p>It is similar to <code>elasticsearch-http()</code>, with the difference that it does not have the <code>type()</code><br>
option, which is deprecated and advised not to use.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4560">#4560</a>)</p>
</li></ul>
<h2>Bugfixes</h2>
<ul><li>
<p><code>network()</code>,<code>syslog()</code>,<code>tcp()</code> destination: fix TCP keepalive</p>
<p><code>tcp-keepalive-*()</code> options were broken on the destination side since v3.34.1.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4559">#4559</a>)</p>
</li><li>
<p>Fixed a hang, which happend when syslog-ng received exremely low CPU time.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4524">#4524</a>)</p>
</li><li>
<p><code>$(format-json)</code>: Fixed a bug where sometimes an unnecessary comma was added in case of a type cast failure.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4477">#4477</a>)</p>
</li><li>
<p>Fix flow-control when <code>fetch-limit()</code> is set higher than 64K</p>
<p>In high-performance use cases, users may configure log-iw-size() and<br>
fetch-limit() to be higher than 2^16, which caused flow-control issues,<br>
such as messages stuck in the queue forever or log sources not receiving<br>
messages.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4528">#4528</a>)</p>
</li><li>
<p><code>int32()</code> and <code>int64()</code> type casts: accept hex numbers as proper<br>
number representations just as the <code>@NUMBER@</code> parser within db-parser().<br>
Supporting octal numbers were considered and then rejected as the canonical<br>
octal representation for numbers in C would be ambigious: a zero padded<br>
decimal number could be erroneously considered octal. I find that log<br>
messages contain zero padded decimals more often than octals.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4535">#4535</a>)</p>
</li><li>
<p>Fixed compilation on platforms where SO_MEMINFO is not available<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4548">#4548</a>)</p>
</li><li>
<p><code>python</code>: <code>InstantAckTracker</code>, <code>ConsecutiveAckTracker</code> and <code>BatchedAckTracker</code> are now called properly.</p>
<p>Added proper fake classes for the <code>InstantAckTracker</code>, <code>ConsecutiveAckTracker</code> and <code>BatchedAckTracker</code> classes, and the wapper now calls the super class' constructor.<br>
Previusly the super class' constructor was not called which caused the
python API to never call into the C API, which's result was that that
the callback was never called.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4549">#4549</a>)</p>
</li><li>
<p><code>python</code>: Fixed a crash when reloading with a config, which uses a python parser with multiple references.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4552">#4552</a>)<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4567">#4567</a>)</p>
</li><li>
<p><code>mqtt()</code>: Fixed the name of the stats instance (<code>mqtt-source</code>) to conform to the standard comma-separated format.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4551">#4551</a>)</p>
</li><li>
<p>metrics: Fixed a memory leak which happened during reload, and was introduced in 4.3.0.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4568">#4568</a>)</p>
</li></ul>
<h2>Packaging</h2>
<ul><li>
<p>scl.conf: The scl.conf file has been moved to /share/syslog-ng/include/scl.conf<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4534">#4534</a>)</p>
</li><li>
<p>C++ plugins: Some of syslog-ng's plugins now contain C++ code.</p>
<p>By default they are being built if a C++ compiler is available.<br>
Disabling it is possible with <code>--disable-cpp</code>.</p>
<p>Affected plugins:</p>
<ul><li><code>lib/syslog-ng/libexamples.so</code>
<ul><li><code>--disable-cpp</code> will only disable the C++ part (<code>random-choice-generator()</code>)</li></ul>
</li><li><code>lib/syslog-ng/libotel.so</code></li></ul>
<p>(<a href="https://github.com/syslog-ng/syslog-ng/pull/4484">#4484</a>)</p>
</li><li>
<p><code>debian</code>: A new module is added, called syslog-ng-mod-grpc.</p>
<p>Its dependencies are: <code>protobuf-compiler</code>, <code>protobuf-compiler-grpc</code>, <code>libprotobuf-dev</code>, <code>libgrpc++-dev</code>.<br>
Building the module can be toggled with <code>--enable-grpc</code>.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4510">#4510</a>)</p>
</li><li>
<p>pcre: syslog-ng now uses pcre2 (8 bit) as a dependency instead of pcre.</p>
<p>The minimum pcre2 version is 10.0.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4537">#4537</a>)</p>
</li></ul>
<h2>Notes to developers</h2>
<ul><li>
<p><code>lib/logmsg</code>: Public field <code>LogMessage::protected</code> has been renamed to <code>LogMessage::write_protected</code>.</p>
<p>Direct usage of this field is discouraged, instead use the following functions:</p>
<ul><li><code>log_msg_is_write_protected()</code></li><li><code>log_msg_write_protect()</code><br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4484">#4484</a>)</li></ul>
</li><li>
<p><code>lib/templates</code>: Public field <code>LogTemplate::template</code> has been renamed to <code>LogTemplate::template_str</code>.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4484">#4484</a>)</p>
</li></ul>
<h2>Other changes</h2>
<ul><li>
<p><code>syslog-ng-cfg-db</code>: Moved to a separate repository.</p>
<p>It is available at: <a href="https://github.com/alltilla/syslog-ng-cfg-helper">https://github.com/alltilla/syslog-ng-cfg-helper</a><br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4475">#4475</a>)</p>
</li><li>
<p><code>disk-buffer</code>: Added alternative option names</p>
<p><code>disk-buf-size()</code> -> <code>capacity-bytes()</code><br>
<code>qout-size()</code> -> <code>front-cache-size()</code><br>
<code>mem-buf-length()</code> -> <code>flow-control-window-size()</code><br>
<code>mem-buf-size()</code> -> <code>flow-control-window-bytes()</code></p>
<p>Old option names are still available.</p>
<p>Example configs:</p>
<div class="gmail-snippet-clipboard-content gmail-notranslate gmail-position-relative gmail-overflow-auto"><pre class="gmail-notranslate"><code>tcp(
"127.0.0.1" port(2001)
disk-buffer(
reliable(yes)
capacity-bytes(1GiB)
flow-control-window-bytes(200MiB)
front-cache-size(1000)
)
);
tcp(
"127.0.0.1" port(2001)
disk-buffer(
reliable(no)
capacity-bytes(1GiB)
flow-control-window-size(10000)
front-cache-size(1000)
)
);
</code></pre></div>
<p>(<a href="https://github.com/syslog-ng/syslog-ng/pull/4526">#4526</a>)</p>
</li><li>
<p>selinux: Added RHEL9 support for the selinux policies</p>
<p>Added RHEL9 support for the selinux policies at <code>contrib/selinux</code><br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4509">#4509</a>)</p>
</li><li>
<p>metrics: replace <code>driver_instance</code> (<code>stats_instance</code>) with metric labels</p>
<p>The new metric system had a label inherited from legacy: <code>driver_instance</code>.</p>
<p>This non-structured label has been removed and different driver-specific labels have been added instead, for example:</p>
<p>Before:</p>
<div class="gmail-snippet-clipboard-content gmail-notranslate gmail-position-relative gmail-overflow-auto"><pre class="gmail-notranslate"><code>syslogng_output_events_total{driver_instance="mongodb,localhost:27017,defaultdb,,coll",id="#anon-destination1#1",result="queued"} 4
</code></pre></div>
<p>After:</p>
<div class="gmail-snippet-clipboard-content gmail-notranslate gmail-position-relative gmail-overflow-auto"><pre class="gmail-notranslate"><code>syslogng_output_events_total{driver="mongodb",host="localhost:27017",database="defaultdb",collection="coll",id="#anon-destination1#1",result="queued"} 4
</code></pre></div>
<p>This change may affect legacy stats outputs (<code>syslog-ng-ctl stats</code>), for example, <code>persist-name()</code>-based naming<br>
is no longer supported in this old format.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4551">#4551</a>)</p>
</li><li>
<p>APT packages: Added Ubuntu Lunar Lobster and Debian Bookworm support.<br>
(<a href="https://github.com/syslog-ng/syslog-ng/pull/4561">#4561</a>)</p>
</li></ul>
<h2>syslog-ng Discord</h2>
<p>For a bit more interactive discussion, join our Discord server:</p>
<p><a href="https://discord.gg/E65kP9aZGm" rel="nofollow"><img src="https://camo.githubusercontent.com/a8db8f03a840d03258a04152f3e25517657c24f41b0728e08fc134d1395a9176/68747470733a2f2f646973636f72646170702e636f6d2f6170692f6775696c64732f313038323032333638363032383134383837372f7769646765742e706e673f7374796c653d62616e6e657232" alt="Axoflow Discord Server" style="max-width: 100%;"></a></p>
<h2>Credits</h2>
<p>syslog-ng is developed as a community project, and as such it relies<br>
on volunteers, to do the work necessarily to produce syslog-ng.</p>
<p>Reporting bugs, testing changes, writing code or simply providing<br>
feedback are all important contributions, so please if you are a user<br>
of syslog-ng, contribute.</p>
<p>We would like to thank the following people for their contribution:</p>
<p>Andreas Friedmann, Attila Szakacs, Balazs Scheidler, Bálint Horváth,<br>
Chuck Silvers, Evan Rempel, Hofi, Kovacs, Gergo Ferenc, László Várady,<br>
Romain Tartière, Ryan Faircloth, vostrelt</p></div></div>