GELF (xm_gelf)
This module provides reader and writer functions that can be used for processing logs in the Graylog Extended Log Format (GELF) for Graylog or GELF-compliant tools.
To examine the supported platforms, see the list of installation packages. |
Unlike syslog format (with Snare Agent, for example), the GELF format contains structured data in JSON so that the fields are available for analysis. This is especially convenient with sources such as Windows Event Log, which generates logs in a structured format.
The xm_gelf module provides the following reader and writer functions.
- InputType GELF_TCP
-
This input reader generates GELF for use with TCP (use with the TCP (im_tcp) input module).
- InputType GELF_UDP
-
This input reader generates GELF for use with UDP (use with the UDP (im_udp) input module).
- InputType GELF
-
This type is equivalent to the
GELF_UDP
reader.
- OutputType GELF_TCP
-
This output writer generates GELF for use with TCP (use with the om_tcp output module).
- OutputType GELF_UDP
-
This output writer generates GELF for use with UDP (use with the om_udp output module).
- OutputType GELF
-
This type is equivalent to the
GELF_UDP
writer.
Configuring NXLog Agent to process GELF input or output requires loading the xm_gelf extension module and then setting the corresponding InputType
or OutputType
in the Input or Output module instance.
See the examples below.
The GELF output generated by this module includes all fields, except for the $raw_event
field and any field having a leading dot (.
) or underscore (_
).
Configuration
The xm_gelf module accepts the following directives in addition to the common module directives.
Optional directives
|
This boolean directive specifies that the GELF output should include fields having a leading dot ( |
This optional directive can be used to specify the length of the short_message field for the GELF output writers. This defaults to 64 if the directive is not explicitly specified. If the field short_message or ShortMessage is present, it will not be truncated. |
|
If this optional boolean directive is |
Fields
The following fields are used by xm_gelf.
In addition to the fields listed below,
if the GELF input contains custom user fields (those prefixed with the _
character),
those fields will be available without the _
prefix.
For example, the GELF record {"_foo": "bar"}
will generate
the field $foo
containing the value "bar"
.
$EventTime
(type: datetime)-
The time when the GELF message was created. This is called
timestamp
in the GELF specification.
$FullMessage
(type: string)-
A long message that might contain a backtrace, a listing of environment variables, and so on.
$Hostname
(type: string)-
The name of the host that sent the GELF message. This is called
host
in the GELF specification.
$SeverityValue
(type: integer)-
The standard syslog severity level. This is called
level
in the GELF specification.
$ShortMessage
(type: string)-
A short message with a brief description of the event. If the "short_message" JSON field is not present in the incoming GELF message, the module uses the truncated value of
$Message
or$raw_event
.
$SourceLine
(type: integer)-
The line in a file that caused the event. This is called
line
in the GELF specification.
$SyslogFacility
(type: string)-
The syslog facility that created the event. This is called
facility
in the GELF specification.
$version
(type: string)-
The GELF specification version as present in the input, e.g.
1.1
.
Examples
This configuration uses the im_tcp module to collect logs over TCP port 12201 and the xm_gelf module to parse them.
Ensure that you call the to_json()
or a similar procedure that populates the $raw_event
field in your output module.
Otherwise, it will log empty lines.
<Extension gelf>
Module xm_gelf
</Extension>
<Extension json>
Module xm_json
</Extension>
<Input tcpin>
Module im_tcp
ListenAddr 0.0.0.0:12001
InputType GELF_TCP
</Input>
<Output file>
Module om_file
File '/opt/nxlog/etc/logs/gelf_out'
Exec to_json();
</Output>
The following configuration reads the Windows Event Log and sends it to a Graylog server in GELF format.
<Extension gelf>
Module xm_gelf
</Extension>
<Input eventlog>
# Use 'im_mseventlog' for Windows XP, 2000 and 2003
Module im_msvistalog
# Uncomment the following to collect specific event logs only
# but make sure not to leave any `#` as only <!-- --> style comments
# are supported inside the XML.
#Query <QueryList>\
# <Query Id="0">\
# <Select Path="Application">*</Select>\
# <Select Path="System">*</Select>\
# <Select Path="Security">*</Select>\
# </Query>\
# </QueryList>
</Input>
<Output udp>
Module om_udp
Host 192.168.1.1:12201
OutputType GELF_UDP
</Output>
<Route eventlog_to_udp>
Path eventlog => udp
</Route>
In this example, custom application logs are collected and sent out in GELF, with custom fields set to make the data more useful for the receiver.
<Extension gelf>
Module xm_gelf
</Extension>
<Input file>
Module im_file
File "/var/log/app*.log"
<Exec>
# Set the $EventTime field usually found in the logs by
# extracting it with a regexp. If this is not set, the current
# system time will be used which might be a little off.
if $raw_event =~ /(\d\d\d\d\-\d\d-\d\d \d\d:\d\d:\d\d)/
$EventTime = parsedate($1);
# Explicitly set the Hostname. This defaults to the system's
# hostname if unset.
$Hostname = 'myhost';
# Now set the severity level to something custom. This defaults
# to 'INFO' if unset. We can use the following numeric values
# here which are the standard syslog values: ALERT: 1, CRITICAL:
# 2, ERROR: 3, WARNING: 4, NOTICE: 5, INFO: 6, DEBUG: 7
if $raw_event =~ /ERROR/ $SyslogSeverityValue = 3;
else $SyslogSeverityValue = 6;
# Set a field to contain the name of the source file
$FileName = file_name();
# To set a custom message, use the $Message field. The
# $raw_event field is used if $Message is unset.
if $raw_event =~ /something important/
$Message = 'IMPORTANT!! ' + $raw_event;
</Exec>
</Input>
<Output udp>
Module om_udp
Host 192.168.1.1:12201
OutputType GELF_UDP
</Output>
<Route file_to_gelf>
Path file => udp
</Route>
With this configuration, NXLog Agent will read a CSV file containing three fields and forward the data in GELF so that the fields will be available on the server.
<Extension gelf>
Module xm_gelf
</Extension>
<Extension csv>
Module xm_csv
Fields $name, $number, $location
FieldTypes string, integer, string
Delimiter ,
</Extension>
<Input file>
Module im_file
File "/var/log/app/csv.log"
Exec csv->parse_csv();
</Input>
<Output udp>
Module om_udp
Host 192.168.1.1:12201
OutputType GELF_UDP
</Output>
<Route csv_to_gelf>
Path file => udp
</Route>