在使用elk的过程中,我的应用场景比较简单,logstash从kafka中取出日志,然后入到对应的日期的es索引中。
我的logstash配置文件如下:
input {
kafka {
bootstrap_servers => "localhost:9092"
group_id => "es"
topics => "event"
consumer_threads => 1
decorate_events => true
type => "event"
codec=> "json"
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "event_%{+YYYYMMdd}"
document_type => "event"
codec=> "json"
}
}
发现实际0-8点的日志会入到昨天的index中,显然是东八区的时区没有生效。查了资料,原来logstash默认utc时间,使用了几种fileter中更改timezone的方法,结果都不对。
查了很多资料,点击打开链接,找到两种方法(其实原理一样):
方法一
更换@timestamp时间戳。配置文件如下:
input {
kafka {
bootstrap_servers => "localhost:9092"
group_id => "es"
topics => "event"
consumer_threads => 1
decorate_events => true
type => "event"
codec=> "json"
}
}
filter {
date {
# match => [ "receive_time","UNIX_MS" ]
#
target => "@timestamp"
#
}
ruby {
code => "event.set('@timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "event_%{+YYYYMMdd}"
document_type => "event"
codec=> "json"
}
}
方法二:
方法1不好之处在于更改了时间戳,如果后面使用到了@timestamp会引发错误,因此可以增加字段保存更改了时区的@timestamp,配置文件如下:
input {
kafka {
bootstrap_servers => "localhost:9092"
group_id => "es"
topics => "event"
consumer_threads => 1
decorate_events => true
type => "event"
codec=> "json"
}
}
filter {
date {
#此处如果日志中没有类似于receive_time保存时间的字段,可注掉,使用当前系统时间
#
match => [ "receive_time","UNIX_MS" ]
#
target => "index_day"
#
}
ruby {
code => "event.set('index_day', event.get('index_day').time.localtime.strftime('%Y%m%d'))"
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "event_%{index_day}"
document_type => "event"
codec=> "json"
}
}
此方法缺点是 引入了新字段。
本人对elk不熟悉,还是初学者,如果你们有更好的解决办法,希望能分享给我。。。
最后
以上就是愤怒果汁最近收集整理的关于logstash日志入库时间差8小时方法一方法二:的全部内容,更多相关logstash日志入库时间差8小时方法一方法二内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复