使用Telegraf和InfluxDB解析Zeek IDS日志的Grok模式匹配问题
解决Telegraf解析Zeek制表符分隔日志的Grok匹配问题
问题说明
使用Telegraf结合InfluxDB解析Zeek IDS日志时,Zeek日志采用制表符分隔,但Telegraf读取日志后会将制表符显示为\t转义字符,导致无法编写有效的Grok模式拆分字段,多次尝试均失败。
Zeek日志示例
1669666446.619248 CLod7M1SB6EGHAp50a fe80::a00:27ff:fe8d:4f7d 143 ff02::16 0 icmp - - - - OTH F F 0 - 1 96 00 -
Telegraf调试信息
2022-11-29T14:36:52Z D! [parsers.grok::tail] Grok no match found for: "1669666446.619248 CLod7M1SB6EGHAp50a fe80::a00:27ff:fe8d:4f7d 143 ff02::16 0 icmp - - - - OTH F F 0 - 1 96 0 0 -"
错误的Grok尝试
%{SYSLOGHOST:ts} %{WORD:uuid}
测试结果:无匹配内容
解决方案
方案1:修正Grok模式
- Grok中匹配转义后的制表符需使用
\t,而非直接输入制表符,因为Telegraf传递给Grok的日志里制表符已转义为\t。 - 时间戳字段应使用
NUMBER模式(Zeek时间戳是数字格式),而非SYSLOGHOST(该模式用于匹配主机名)。 - 针对示例日志的基础Grok模式可修改为:
%{NUMBER:ts}\t%{WORD:uuid}
- 完整匹配所有字段的Grok模式示例:
%{NUMBER:ts}\t%{WORD:uuid}\t%{IPV6:src_ip}\t%{NUMBER:src_port}\t%{IPV6:dst_ip}\t%{NUMBER:dst_port}\t%{WORD:proto}\t%{DATA:field1}\t%{DATA:field2}\t%{DATA:field3}\t%{DATA:field4}\t%{WORD:type}\t%{WORD:flag1}\t%{WORD:flag2}\t%{NUMBER:num1}\t%{DATA:field5}\t%{NUMBER:num2}\t%{NUMBER:num3}\t%{NUMBER:num4}\t%{DATA:field6}
方案2:使用Telegraf CSV解析器(更简便)
Zeek日志是标准制表符分隔格式,直接用CSV解析器比Grok更高效,无需编写复杂模式。在Telegraf配置中添加:
[[inputs.tail]] files = ["/path/to/your/zeek/logs/*.log"] from_beginning = true [[processors.csv]] delimiter = "\t" # 根据Zeek日志的实际字段名替换下方的header内容 header = ["ts", "uuid", "src_ip", "src_port", "dst_ip", "dst_port", "proto", "unused1", "unused2", "unused3", "unused4", "packet_type", "flag_f", "flag_f2", "num_zero", "unused5", "count", "length", "unused6", "unused7"]
内容的提问来源于stack exchange,提问作者Mateus Soares
相关产品推荐
相关产品推荐

