Logstash和Windows 2008 DNS调试日志

时间:2014-11-21 17:22:30

标签: filter logstash grok logstash-grok

我通过json将Windows DNS调试日志发送到Elasticsearch,我需要解析它们。 与微软一样,一切都很简单。 DNS调试日志不是CSV。该文件中唯一有用的是它具有固定长度的列。

以下是DNS日志的示例: 11/21/2014 5:59:13 PM 0458 PACKET 00000000039ED750 UDP Rcv 192.168.1.98 600c Q [0001 D NOERROR] A (9)grokdebug(9)herokuapp(3)com(0) 11/21/2014 5:59:13 PM 0458 PACKET 00000000039EF460 UDP Snd 192.168.1.1 e044 Q [0001 D NOERROR] A (9)grokdebug(9)herokuapp(3)com(0) 11/21/2014 5:59:13 PM 0458 PACKET 00000000039F85B0 UDP Rcv 192.168.1.1 e044 R Q [8081 DR NOERROR] A (9)grokdebug(9)herokuapp(3)com(0) 11/21/2014 5:59:13 PM 0458 PACKET 00000000039F85B0 UDP Snd 192.168.1.98 600c R Q [8081 DR NOERROR] A (9)grokdebug(9)herokuapp(3)com(0)

我查看了Stackoverflow的回答:Logstash grok filter help - fixed position file 并试图设置一个grok过滤器来解析列,但它不适合我。 我知道我有一个语法问题,但我似乎无法找到一个好的例子来指导我正确的方向。

这是我的grok过滤器: grok { match => [ "message", "(?<dns_date_n_time>.{21}) (?<dns_field_1>.{5}) (?dns_type>.{8}) (?<dns_field_2>.{19}) (?<dns_protocol>.{4}) (?<dns_direction>.{4}) (?<dns_ip>.{16}) (?<dns_field_3>.{4}) (?<dns_query_type>.{5}) (?<dns_field_5>.{7}) (?<dns_field_6>.{3}) (?<dns_flag>.{9}) (?<dns_field_7>.{2}) (?<dns_record>.{5}) (?<dns_domain>.{255})" ] }

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

不要对日志文件恰好具有固定宽度格式这一事实感到不满。从那以后,它在这里并没有真正帮助。使用相关的grok模式将文件解析为任何旧的日志文件。这适用于您提供的输入:

(?<timestamp>%{DATE_US} %{TIME} (?:AM|PM))\s+%{NUMBER}\s+%{WORD:dns_type}\s+
%{BASE16NUM}\s+%{WORD:dns_protocol}\s+%{WORD:dns_direction}\s+%{IP:dns_ip}\s+
%{BASE16NUM}\s+%{WORD:dns_query_type}\s+\[%{BASE16NUM}\s+%{WORD}\s+
%{WORD:dns_result}\]\s+%{WORD:dns_record}\s+%{GREEDYDATA:dns_domain}

那就是说,因为我不知道日志文件中的每一列意味着这里使用的某些模式可能过于草率或过于严格。我已插入换行符以使答案更具可读性,但请确保在将其插入配置文件时正确连接。