添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

决定数据进入到哪个index中的决定因素是@timestamp,@timestamp是日志上报的时间

logstash将东8区的时间,错误转换为了UTC时间,减去了8个小时,从而导致数据被路由到了9月16日的index中

需要补充一个基础知识:logstash中@timestamp作用

In the absence of this filter, logstash will choose a timestamp based on the first time it sees the event (at input time), if the timestamp is not already set in the event. For example, with file input, the timestamp is set to the time of each read.

  • 如果在event中设置了@timestamp这个字段,那么logstash就会复用这个字段

  • 如果event中没有设置,那么就会将时间设置为logstash读取到这个event的时间

我们这里并没有特别处理@timestamp,所以其就是日志上报到logstash的时间

这里包含一个业务知识:我们的上报并不是即时上报的,会发生延时上报的情况,日志真实发生的时候logdatetime与@timestamp并不相同

我们的kibana时间filter使用的是生产环境中的实际日志产生的时间:logdatetime

而决定数据进入到哪个index中的决定因素是@timestamp,@timestamp是日志上报的时间

这两个错误叠加,导致问题

解决方案:

很多的解决方案是说 用自己的某个时间字段覆盖掉@timestamp这个字段,但是我并不想这么做,因为@timestamp记录的是这个事件初次被logstash读取的时间(可以认为是上报的时间)

要不就把@timestamp这个字段转换为,比如说reportTimestamp字段,然后把logDatetime字段转换为@timestamp字段,这样就会实现这一天的点击行为都会进入到同一个物理index中。

add_field => {"reportTimestamp" => "%{@timestamp}"}

最后的效果:

可以看到真实发生的时间 与 上报的时间是一致的,并且进入到正确的index中,与日志记录保持一致

而上报的时间reportTimestamp被单独记录下来

这样就会实现这一天的点击行为都会进入到同一个物理index中,对于一天的用户行为统计,可以避免es的跨index查询

场景:有一个用户行为日志的统计,其使用logstash过滤后放到es里面。脚本是这样每天记录加入一个field,指定其位置根据这个filed,放到es指定的index中问题:2019.09.17的index2019.09.16的index显然遇到了时区转换问题原因:logstash创建es索引默认使用@timestamp的UTC时间.... 1、 logstash 采集日志数据,并将日志数据写入 ES 集群中,其中@ timestamp 采用北京 时间 默认 为ISO8601) 2、elastalert 间隔60秒运行一次规则文件,如果查询到匹配规则文件的日志,则告警。elastalert 默认 是查询 @ timestamp ,并在内部转换为 ISO8601 格式的 时间 。 二、 解决 方案 1、 logstash 执行时指定的配置文件,在... 时区 是地球上的区域 使用 同一个 时间 定义。为了照顾到各地区的 使用 方便,又使其他地方的人容易将本地的 时间 换算到别的地方 时间 上去。1884年的国际经度会议规规定将地球表面按经线从南到北划分为24个 时区 ,并且规定相邻区域的 时间 相差1小时。当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时。 地球自西向东旋转,东边比西边先看到太阳,东边的...
1、 问题 : 版本: logstash -7.16.2 Logstash 中的 时间 为格林威治 时间 ,而我们 时区 是东8区,因此通过 logstash 采集到的数据和我们的 时间 会有8小时的时差。 当我们是上午8点钟时,格林威治 时间 才是0点,跟 时间 有关的都会有 问题 。 2、 解决 方法 解决 方法 是在 当前 时间 的基础上加上8小时。 filter { ruby { code => "event.set(' timestamp ', event.get('@ timestamp ').time.localtime + 8*
filter { #ruby { # code => "event.set(' timestamp ', event.get('@ timestamp ') + 8*60*60)" # code => "event.set('aaa', event.get('@ timestamp ').time.localtime)" # code => "event.set('bbb', event. timestamp .time.localtime +
使用 logstash 时, 默认 使用 了一个 时间 字段@ timestamp ,@ timestamp 时间 使用 的是 utc 时间 ,在kibana中展示时,一般自己会增加新字段,不影响判断。但是最近需要 使用 ----elastalert,监测waf的拦截日志然后通过企业微信进行告警,触发 时间 如果再 使用 --@ timestamp ,会对一些信息接收人产生误解,所以要将@ timestamp 时间 转换成本地date 时间 。 综合参考其他人的方案,在 logstash 中,监测对象配置里的--filter中添加代码是最直接方便的。重启logs.
logstash -2.3.1按日产生 索引 (%{+YYYY.MM.dd})产生 时间 比预计晚8小时 问题 由于Elasticsearch、 Logstash 内部,对 时间 类型字段,是统一采用 UTC 时间 ,outputs/elasticsearch中常用的 %{+YYYY.MM.dd} 这种写法必须读取 @ timestamp ,为了 解决 索引 产生的 时间 问题 ,必须先 解决 @ timestamp 时区 问题 。... 写在最前面, 这个 logstash 解决 时差的原理是利用 timestamp 字段替换 logstash 的@tim es amp字段。 如果日志里没有这个 timestamp 字段,则无效。 Logstash 2.3版本 logstash 的date插件配置: date { match =>[" timestamp ","dd/MMM/yyyy:HH:mm:ss Z"] target =>...
在之前转载的一腾讯高级工程师《一文彻底了解 Logstash 》对logstach有这详细的介绍,这里我只说明一下,将mysql中的数据 使用 logstash 导入到 es 中,如何操作,具体步骤见下方: 下载 logstash https://artifacts.elastic.co/downloads/ logstash / logstash -7.3.2.zip 解压的指定目录 在bin的同级目录中 创建 存放my...
public void insert Es (String jsonStr){ JSONObject jsonObject = JSONObject.parseObject(jsonStr); jsonObject.put("@tim es ...
对@ timestamp 的8小时的 问题 的解释,请参考http://blog.csdn.net/shan1369678/article/details/51375537 ,解释的很详细。在这里结合我自己的项目,来谈对这个 问题 的理解。对 ES 中的某条日志,有如下两个字段: DATETIME 是日志生成的 时间 戳,我们并不清楚该日志的来源,故不能确定该日志是否是 UTC 还是 UTC +8。但一般来说,很可
Logstash 中,@ timestamp 字段 默认 情况下是 UTC 时间 ,但可以 使用 date过滤器来将其转换为本地 时区 。 以下是一个示例配置文件,其中 使用 date过滤器将@ timestamp 转换为美国洛杉矶 时区 : input { # 输入数据源 filter { date { match => ["@ timestamp ", "ISO8601"] timezone => "America/Los_Angel es " output { # 输出数据目的地 在这个示例中,date过滤器 使用 ISO8601格式匹配@ timestamp 字段,并将其转换为美国洛杉矶 时区 。您可以根据需要将timezone参数更改为所需的 时区