Rewriting and modifying logs
NXLog provides various ways to modify log records.
Simple rewrite of log message
A simple rewrite can be done by modifying the $raw_event field
without parsing the message (with Syslog, for example). Regular
expression capturing can be used for this.
This statement, when used in an Exec directive,
will apply the replacement directly to the $raw_event field. In this
case, a parsing procedure like
parse_syslog() would not be used.
if $raw_event =~ /^(aaaa)(replaceME)(.+)/
    $raw_event = $1 + 'replaceMENT' + $3;This example will convert a timestamp field to a different
format. Like the previous example, the goal is to modify the
$raw_event field directly, rather than use other fields and then a
procedure like to_json() to update
$raw_event.
The input log format is line-based, with whitespace-separated fields. The first field is a timestamp expressed as seconds since the epoch.
1301471167.225121 AChBVvgs1dfHjwhG8 141.143.210.102 5353 224.0.0.251 5353 udp dns - - - S0 - - 0 D 1 73 0 0 (empty)In the output module instance Exec directive,
the regular expression will match and capture the first field from the
line, and remove it. This captured portion is parsed with the
parsedate() function and used to set the
$EventTime field. This field is then prepended to the $raw_event
field to replace the previously removed field.
<Input in>
    Module  im_file
    File    "conn.log"
</Input>
<Output out>
    Module  om_tcp
    Host    192.168.0.1
    Port    1514
    <Exec>
        if $raw_event =~ s/^(\S+)//
        {
            $EventTime = parsedate($1);
            $raw_event = strftime($EventTime, 'YYYY-MM-DDThh:mm:ss.sTZ') +
                         $raw_event;
        }
    </Exec>
</Output>2011-03-30T00:46:07.225121-07:00 AChBVvgs1dfHjwhG8 141.143.210.102 5353 224.0.0.251 5353 udp dns - - - S0 - - 0 D 1 73 0 0 (empty)Modifying fields in a log message
A more complex method is to parse the log message into fields, modify some fields, and finally reconstruct the event record from the fields. This method is much more versatile: it allows rewriting to be done regardless of input and output formats of the log.
In this example, each Syslog message is received via UDP and parsed
with parse_syslog_bsd(). Then, if
the $Message field matches the regular expression, the
$SeverityValue field is modified. Finally, the
to_syslog_bsd() procedure generates
$raw_event from the fields.
<Extension _syslog>
    Module  xm_syslog
</Extension>
<Input udp>
    Module  im_udp
    Port    514
    Host    0.0.0.0
    Exec    parse_syslog_bsd();
</Input>
<Output file>
    Module  om_file
    File    "/var/log/logmsg.txt"
    <Exec>
        if $Message =~ /error/ $SeverityValue = syslog_severity_value("error");
        to_syslog_bsd();
    </Exec>
</Output>
<Route syslog_to_file>
    Path    udp => file
</Route>Renaming and deleting fields in a log message
In some cases it may be necessary to rename or delete fields in an event record.
The simplest way is to use the NXLog language and the Exec directive.
This statement uses the rename_field() procedure to
rename the $user field to $AccountName.
rename_field($user, $AccountName);This statement uses the delete() procedure to
delete the $Serial field.
delete($Serial);Alternatively, the xm_rewrite extension module (available in NXLog Enterprise Edition) can be used to rename or delete fields in a log record.
This example uses the parse_syslog()
procedure to create a set of Syslog fields in the
event record. It then uses the Keep
directive to whitelist a set of fields, deleting any field that is not
in the list. Finally the Rename directive
is used to rename the $EventTime field to $Timestamp. The
resulting event record is converted to JSON and sent out via TCP.
<Extension json>
    Module  xm_json
</Extension>
<Extension rewrite>
    Module  xm_rewrite
    Keep    EventTime, Severity, Hostname, SourceName, Message
    Rename  EventTime, Timestamp
</Extension>
<Input in>
    Module  im_file
    File    '/var/log/messages'
    Exec    parse_syslog(); rewrite->process();
</Input>
<Output out>
    Module  om_tcp
    Host    10.0.0.1
    Port    1514
    Exec    to_json();
</Output>
<Route r>
    Path    in => out
</Route>Here is an example Extension block that uses the Delete directive to delete all the severity fields. This could be used to prevent severity-based matching (during later processing) on a log source that does not set severity values correctly.
<Extension rewrite>
    Module  xm_rewrite
    Delete  SyslogSeverityValue, SyslogSeverity, SeverityValue, Severity
</Extension> 
   