我正在使用 logstash 从一组 webapps 中收集日志并将它们发送到 graylog2 以供集中查看。
我有以下用于标记化的过滤器:
grok {
type => "webapps"
pattern => "^%{TIME:timestamp} \[%{NOTSPACE:thread}\]%{SPACE}%{WORD:loglevel}%{SPACE}%{JAVACLASS:class} - %{GREEDYDATA:short_message}"
drop => false
debug => "true"
add_tag => [ "%{loglevel}" ]
}
日志级别将按照 TRACE、DEBUG、INFO、NOTICE、ERROR、FATAL 的顺序排列。
最初,所有内容都显示为“警报”(在 ruby/graylog-server 中的数值为 5,并在源代码中标记为“未知”)。
然后我添加了一系列 mutate 过滤器,比如这个:
mutate {
type => "webapps"
tags => "INFO"
add_tag => [ "ll_%{@level}", "mutated" ]
replace => [ "@level", "6" ] # informational
}
这让我更接近显示在网络界面中的正确日志级别/严重性,但所有“信息”消息都显示为调试消息。
我写了一个脚本来查看 elasticsearch 数据并根据它应该是什么来设置级别字段。
- 调试:7
- 信息 : 6
- 警告:4
- 错误:3
- 关键:2
0、1 和 5 级未被使用,因为消息来源表明这些是保留的。
但是这个脚本在资源方面很昂贵,而且当它试图更新的数据集以每秒数百或数千条消息的速度增长时,我认为它不会很好地工作。
我注意到的另一件事是,当我在标签中使用类似“@source”的内容时,会显示正确的值。当我执行“@level”时,我将其作为文字插入,这表明它不是已指示的预定义字段。
我已经稍微查看了资料来源,但并不详尽,所以我可能只是错过了它。
问题是,我需要在我的 mutate 过滤器中更改什么才能使“信息”在 graylog2 界面中显示为“信息”?
我尝试过的任何方法都不起作用,邮件列表也无济于事。
我最后做的是停止为此使用 logstash,并添加一个 logback-gelf jar 并添加到我的 logback 配置中。
从那时起,它就像一个魅力。