我已经这样做有一段时间了,我觉得 Logstash 中的 JSON 过滤器正在为我删除数据。我最初遵循的教程来自https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-ubuntu-14-04
我做了一些改变,但大部分都是一样的。我的 grok 过滤器看起来像这样:
uuid #uuid and fingerprint to avoid duplicates
{
target => "@uuid"
overwrite => true
}
fingerprint
{
key => "78787878"
concatenate_sources => true
}
grok #Get device name from the name of the log
{
match => { "source" => "%{GREEDYDATA}%{IPV4:DEVICENAME}%{GREEDYDATA}" }
}
grok #get all the other data from the log
{
match => { "message" => "%{NUMBER:unixTime}..." }
}
date #Set the unix times to proper times.
{
match => [ "unixTime","UNIX" ]
target => "TIMESTAMP"
}
grok #Split up the message if it can
{
match => { "MSG_FULL" => "%{WORD:MSG_START}%{SPACE}%{GREEDYDATA:MSG_END}" }
}
json
{
source => "MSG_END"
target => "JSON"
}
所以我认为引起问题的部分是底部。我的东西应该都是正确的。当我运行此配置时,我看到 kibana 中的所有内容都正确显示,除了所有包含 JSON 代码的日志(并非所有日志都有 JSON)。当我在没有 JSON 过滤器的情况下再次运行它时,它会显示所有内容。
我尝试使用 IF 语句,以便它仅在包含 JSON 代码时运行 JSON 过滤器,但这并没有解决任何问题。
但是,当我添加 IF 语句以仅运行特定的 JSON 格式时(因此,如果 MSG_START = x、y 或 z,则 MSG_END 将具有不同的 json 格式。在这种情况下,假设我只解析 z 格式),然后在 kibana 中我会看到包含 x 和 y JSON 格式的所有日志(虽然未解析),但它不会显示 z。所以我确信这一定与我使用 JSON 过滤器的方式有关。
另外,每当我想用新数据进行测试时,我都会开始清除elasticsearch中的旧数据,这样如果它有效,我就知道是我的logstash在工作,而不仅仅是从elasticsearch运行内存。我已经使用了这个方法XDELETE 'http://localhost:9200/logstash-*/'
。但是logstash不会在elasticsearch中创建新索引,除非我为filebeat提供新日志。我不知道这是否是另一个问题,只是觉得我应该提一下。
我希望一切都有意义。
编辑:我只是检查了logstash.stdout文件,结果发现它正在解析json,但它只在kibana中显示带有“_jsonparsefailure”的内容,所以Elastisearch一定出了问题。或许。我不知道,只是集思广益:)
示例日志:
1452470936.88 1448975468.00 1 7 mfd_status 000E91DCB5A2 负载 {"up":[38,1.66,0.40,0.13],"mem":[967364,584900,3596,116772],"cpu":[1299,812 ,1791,3157,480,144 ],"cpu_dvfs":[996,1589,792,871,396,1320],"cpu_op":[996,50]}
MSG_START 是加载,MSG_END 是上面示例中之后的所有内容,因此 MSG_END 是我要解析的有效 JSON。
下面的日志中没有 JSON,但我的logstash 将尝试解析“Inf:”之后的所有内容并发送“_jsonparsefailure”。
1452470931.56 1448975463.00 1 6 rc.app 02:11:03.301 Inf: NOSApp: UpdateSplashScreen 未在此平台上实现
这也是我在 Logstash 中的输出,因为我觉得这现在很重要:
elasticsearch
{
hosts => ["localhost:9200"]
document_id => "%{fingerprint}"
}
stdout { codec => rubydebug }