搭建ELK环境导入的数据发现,@timestamp时间永远比nginx日志里面的文件记录的时间少了8小时,比如日志文件里面一行记录,设置的字段时间为2017-06-22 09:33:26,但是导入到es里面时间变成"@timestamp": "2017-06-22T01:33:26.000Z",少了整整8个小时,但是kibana显示图表的时候却是没有。后来查资料知道这是es设置的东八区问题,kibana会根据浏览器国家自动添加时间,所以我们看到kibana上显示是正常的。
解决办法如下:
1.在查询条件上设置时区
QueryBuilders.rangeQuery("@timestamp").format("yyyy-MM-dd HH:mm:ss.SSS").gte("2017-06-22 00:00:00.000").lte("2017-06-22 23:59:59.999").timeZone("Asia/Shanghai")
Asia/Shanghai也可以替换成+8:00
2.logstash filter的时候添加字段,比如添加importtime字段
grok {
match => { "message" => "\[visit_time:(?<ctime>.*)\],\[uid:(?<uid>.*)\],\[ip:(?<ip>.*)\],\[city_id:(?<cityid>.*)\],\[event:(?<event>.*)\],\[typeOnename:(?<typeOnename>.*)\],\[typeOnevalue:(?<typeOnevalue>.*)\],\[typetwoname:(?<typetwoname>.*)\],\[typetwovalue:(?<typetwovalue>.*)\],\[channel_type:(?<channel_type>.*)\],\[aid:(?<aid>.*)\],\[ticket_group_id:(?<ticket_group_id>.*)\],\[order_sn:(?<order_sn>.*)\],\[extends:(?<extends>.*)\]" }
add_field => [ "importtime", "%{@timestamp}" ]
}
date {
match => ["ctime", "YYYY-MM-dd HH:mm:ss"]
target => "@timestamp"
}
ruby {
code => "event.set('importtime', event.get('@timestamp').time.localtime + 8*60*60)"
}
用字段方法过滤后,在es里面会发现每行记录多了个importtime字段