12.7. The Apache Access Log Parser

The Apache Access Log Parser can parse the access log messages of the Apache HTTP Server. The syslog-ng OSE application can separate these log messages to name-value pairs. For details on using value-pairs in syslog-ng OSE see Section 2.10, Structuring macros, metadata, and other value-pairs. The apache-accesslog-parser() supports both the Common Log Format and the Combined Log Format of Apache (for details, see the Apache HTTP Server documentation). The following is a sample log message: - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

The syslog-ng OSE application extracts every field into name-value pairs, and adds the .apache. prefix to the name of the field.


parser parser_name {

The parser extracts the following fields from the messages: clientip, ident, auth, timestamp, rawrequest, response, bytes, referrer, and agent. The rawrequest field is further segmented into the verb, request, and httpversion fields. The syslog-ng OSE apache-accesslog-parser() parser uses the same naming convention as Logstash.

Example 12.15. Using the apache-accesslog-parser parser

In the following example, the source is a log file created by an Apache web server. The parser automatically inserts ".apache." prefix before all extracted name-value pairs. The destination is a file, that uses the format-json template function. Every name-value pair that begins with a dot (".") character will be written to the file (dot-nv-pairs). The log statement connects the source, the destination, and the parser.

source s_apache {

destination d_json {
        template("$(format-json .apache.*)\n"));

log {
      parser { apache-accesslog-parser();};

To use this parser, the scl.conf file must be included in your syslog-ng OSE configuration:

@include "scl.conf"

The apache-accesslog-parser() is actually a reusable configuration snippet configured parse Apache access log messages. For details on using or writing such configuration snippets, see Section 5.6.2, Reusing configuration blocks. You can find the source of this configuration snippet on GitHub.