首页 新闻 赞助 找找看

[ELK]Logstash接收到的日志时间顺序与Filebeat发出的顺序不一样

0
悬赏园豆:60 [待解决问题]

用filebeat收集 /tmp/testlog/no7.log 的内容后,传送给Logstash服务器,Logstash把收到的内容输出为 /tmp/logstash/no7.log

传送没有出现日志缺失,但是发现时间顺序是混乱的,具体情况如下:

filebeat.yml

filebeat.inputs:

  • type: log
    enabled: true
    paths:
    • /tmp/testlog/no7.log
      output.logstash:
      hosts: ["xxx.xx.x.xxx:5044"]
      ----------------------------------------------------------------------------

logstash.conf

input {
beats {
port => 5044
}
}
output {
file {
path => "/tmp/logstash/no7.log"
codec => line { format => "%{message}"}
}
}
----------------------------------------------------------------------------

时间乱序情况如下:

/tmp/testlog/no7.log(Filebeat服务器)

no7 0 2020年 1月 14日 火曜日 17:48:36 JST
no7 1 2020年 1月 14日 火曜日 17:48:37 JST
no7 2 2020年 1月 14日 火曜日 17:48:38 JST
no7 3 2020年 1月 14日 火曜日 17:48:39 JST
no7 4 2020年 1月 14日 火曜日 17:48:40 JST
no7 5 2020年 1月 14日 火曜日 17:48:41 JST
no7 6 2020年 1月 14日 火曜日 17:48:42 JST
no7 7 2020年 1月 14日 火曜日 17:48:43 JST
no7 8 2020年 1月 14日 火曜日 17:48:44 JST
no7 9 2020年 1月 14日 火曜日 17:48:45 JST
----------------------------------------------------------------------------

/tmp/logstash/no7.log(Logstash服务器)

no7 2 2020年 1月 14日 火曜日 17:48:38 JST
no7 6 2020年 1月 14日 火曜日 17:48:42 JST
no7 3 2020年 1月 14日 火曜日 17:48:39 JST
no7 7 2020年 1月 14日 火曜日 17:48:43 JST
no7 0 2020年 1月 14日 火曜日 17:48:36 JST
no7 4 2020年 1月 14日 火曜日 17:48:40 JST
no7 8 2020年 1月 14日 火曜日 17:48:44 JST
no7 1 2020年 1月 14日 火曜日 17:48:37 JST
no7 5 2020年 1月 14日 火曜日 17:48:41 JST
no7 9 2020年 1月 14日 火曜日 17:48:45 JST
----------------------------------------------------------------------------

可以看见,Logstash接受到的所有内容都是乱序排列,请问怎么才能让它按照Filebeat服务器里的顺序输出呢
请大家帮帮忙,麻烦了

——————

有在网上搜过解决方法,都说是用filter的date来处理,但是按照目前能找到的所有回答都试了一遍,乱序问题依旧没有解决

hatsuhi的主页 hatsuhi | 初学一级 | 园豆:149
提问于:2020-01-14 17:41
< >
分享
所有回答(1)
0

如果试了一遍没有解决,说明你并没有成功使用你的日志时间作为logstash时间戳解析,否则不会再乱序了。再尝试一下,看下是不是过程出错了

但行好事-莫问前程 | 园豆:254 (菜鸟二级) | 2020-01-15 09:30

谢谢您的回答
我在网上搜索之后,试过在logstash.conf里加入以下内容
---------------------------------------------------------------
filter {
grok {
match => ["message", "%{TIMESTAMP_ISO8601:logdate}"]
}
date {
match => ["logdate", "yyyy-MM-dd HH:mm:ss.SSS"]
target => "@timestamp"
}
}
--------------------------------------------------------------------
但是问题没有任何改善,请问是有哪里出错了么?
如果方便的话,请问能够给个模板?

支持(0) 反对(0) hatsuhi | 园豆:149 (初学一级) | 2020-01-15 12:30

@hatsuhi: 模板没有,不过可以看出你还没有理解这个东西。思路是这样子,先用grok写个规则切分你的日志,你的切分应该是失败的吧,找个例子理解一下。切分后得到时间字段,再使用date插件指定时间戳,你这个时间只到秒,应该也要注意时间格式

支持(0) 反对(0) 但行好事-莫问前程 | 园豆:254 (菜鸟二级) | 2020-01-15 13:58

@但行好事-莫问前程: 谢谢提供的思路,经过多次验证,grok的切分是成功了的,但是date插件完全没起作用,指定时间戳失败,时间戳的值完全没变化。但是明明我也没设置什么奇怪的东西啊,请问这种情况该怎么解决呢?

例:1111 2020-01-21T13:46:50+0900

logstash设置:

input { stdin {} }

filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:logdate}" }
}
date {
match => [ "logdate", "ISO8601" ]
target => "@timestamp"
}
}
output { stdout { codec => rubydebug }}
---------------------------------------------------------------------------------------------
结果:
{
"@timestamp" => 2020-01-21T04:46:50.000Z,
"logdate" => "2020-01-21T13:46:50+0900",
"host" => "rhel75-cranemg7407",
"message" => "1111 2020-01-21T13:46:50+0900",
"@version" => "1"
}

支持(0) 反对(0) hatsuhi | 园豆:149 (初学一级) | 2020-01-21 08:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册