Nxlog - 如何处理具有多个标头的多行日志

时间:2016-10-18 19:08:28

标签: multiline nxlog

我想使用nxlog预处理以下日志结构,然后将其发送到graylog。

我的自定义应用日志结构:

timestamp;field1;field2; ---- Start of good event ----
timestamp;field3;field4;field5;field6
timestamp;field7;field8;field9;field10
timestamp;field11;field12; --- End of good event ---
timestamp;FAIL;field13;field14
timestamp;FAIL;field15;field16

nxlog的GELF输出应包含带有“good event”或“bad event”的full_message。

“好事件”= 1行如下:

timestamp;field1;field2; ---- Start of good event ----;timestamp;field3;field4;field5;field6;timestamp;field7;field8;field9;field10;timestamp;field11;field12; --- End of good event ---

“坏事件”应包含如下一行:

timestamp;FAIL;field13;field14; timestamp;FAIL;field15;field16 

使用xm_multiline解析“good event”并定义它的HeaderLine和EndLine是没有问题的。

但我完全不知道如何解析两条不同的多线。你能给我任何暗示吗?

是否可以将if-else语句与“InputType”一起使用?我的意思是“如果condition1然后InputType好事件和一些动作,否则InputType坏事件和一些动作”。或者它需要完全不同的方法 - 例如没有xm_multiline用法但是某种正则表达式魔法?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您仍然可以使用xm_multiline。您只需要使用正则表达式定义两种不同的模式即可。

由于您未提供配置,因此我将使用其他日志格式的配置作为示例。

我有一个Java应用程序,需要监视其日志,该应用程序未使用一致的时间格式,因此消息可能如下所示:

2019-04-24 00:00:13,952 WARN  [SemaphoreArrayListManagedConnectionPool] (QuartzScheduler_quartzScheduler-wildflyapp0201401_ClusterManager) IJ000604: Throwable while attempting to get a new connection: null: javax.resource.ResourceException: IJ031084: Unable to create connection
 new connection: null: javax.resource.ResourceException: IJ031084: Unable to create connection
        at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createLocalManagedConnection(LocalManagedConnectionFactory.java:336)
        at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:343)

或者这样:

14:00:34,426 INFO  [stdout] (default task-73) com.xyz.england.idserver.comp.impl.Service DEBUG  [Get][db113034-ecc6-4c0d-86f2-moo3e33942f2] Job Package id.
14:00:34,426 INFO  [stdout] (default task-73) [DEBUG 2019-04-24 14:00:34,426]  [Get][db113034-ecc6-4c0d-86f2-moo3e33942f2] Job Package id.
14:00:34,427 INFO  [stdout] (default task-39) com.xyz.england.idserver.comp.impl.Service DEBUG  [Get][0c4d63c0-74d7-4599-bc40-mooa84cf62ea] Job Package id.
14:00:34,427 INFO  [stdout] (default task-39) [DEBUG 2019-04-24 14:00:34,425]  [Get][0c4d63c0-74d7-4599-bc40-mooa84cf62ea] Job Package id.

如果日志使用一种或其他时间格式,则本可以使用以下两种配置之一:

<Extension java_multiline>
    Module          xm_multiline
    HeaderLine      /^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d,\d\d\d /
</Extension>

OR

<Extension java_multiline>
    Module          xm_multiline
    HeaderLine      /^\d\d:\d\d:\d\d,\d\d\d/
</Extension>

由于不是这种情况,我不得不使用交替将它们包括在单个语句中,特别是使用管道符号或OR操作数:

<Extension java_multiline>
    Module          xm_multiline
    HeaderLine      /^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d,\d\d\d |^\d\d:\d\d:\d\d,\d\d\d /
</Extension>

使用此正则表达式语句,两种时间格式都将与我的标题行匹配。