最近在存储数据到es中,总会有各种各样的问题,找遍了全网,也没有发现一个总结的比较好的,特此个人总结一下。
1.在使用log(elk,logstash)存储数据到elk时,因为用的是带时区的方法,也就是:
yyyy-MM-dd'T'HH:mm:ss:SSS'Z'
这种格式,默认是UTC时间,东八区需要+8小时,所以在打日志的时候存储其他时间时:
时间不要以这种格式:
yyyy-MM-dd HH:mm:ss
因为存不了空格,精度会丢失,也不要这样:
yyyy-MM-dd-HH:mm:ss
因为elk在解析时会默认把这种格式时间转换,精度还是有问题,所以要不然直接这样把:
yyyy-MM-ddHH:mm:ss
或
yyyy年MM月dd日HH:mm:ss:SSS
当然你也可以存这种:
DateFormater.DATE_STYLE_UTC = "yyyy-MM-dd'T'HH:mm:ss:SSS'Z'";
logMessage.put("creTime", DateFormater.DateToString(new Date(),DateFormater.DATE_STYLE_UTC));
这样子存的时间是带时区的,不过!!!!你得-8小时,不然和es自带的UTC时间不统一了,会有大麻烦的!
所以别让他搞事就对了,不过这样我们在查询时会有很多麻烦,最后权衡还是决定存时间戳:
new Date().getTime()
2.在Document中创建时间类型字段时,有几种写法,主要是:
// 下发时间
@Field(type = FieldType.Date, format=DateFormat.custom,pattern ="yyyy-MM-dd HH:mm:ss:SSS")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd HH:mm:ss:SSS",timezone="GMT+8")
private Date creTime;
(1)时区如果不+8,就会造成时间少八小时
(2)没有jsonFormat,存储在es的是时间是long类型:
(3)格式化完成后,时间格式:
(4)多次尝试想要格式化成这样yyyy-MM-dd'T'HH:mm:ss:SSS'Z' 带时区的数据,可是每次这样过后得会造成数据格式为text了,目前没有很好的解决方案,参考:https://stackoverrun.com/cn/q/8825116 可是完全没用啊。。。
3.在kibana中,默认带时区的时间会根据浏览器所在的地区自动计算正确时间:
最新更新:
存的时间目前还是用时间戳的方式,但是logstash存储的时间可以通过查询的时候设置时区来解决:
QueryBuilder rangeBuilder = QueryBuilders
.rangeQuery("@timestamp")
.format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.timeZone("Asia/Shanghai") // 时区设置
.gte(sevTime);
设置时区,可以让时间正确
其他:
希望有大佬解决了注解时间无法存成带时区格式的时间可以留言告诉我下解决方案!!