Kibana/Logstash时间问题

Kibana/Logstash Time Issue

任务:将 CSV 格式的记录发送到 logstash 进行解析。

优点:所有解析都有效。所有 CSV 文件都被拆分成单独的字段,可以在 kibana 中看到。

缺点:所有带有日期的字段都不准确。日期晚了一天,它包含的时间始终为 18:00:00。在解析之前,CSV 中从未提供过时间。 logstash 配置中从未添加过任何时间。但是出于某种原因,在 kibana 中看到过一段时间。

详情: CSV 中的日期格式为:YYYY-MM-DD。

logstash 配置仅解析字段。它不进行转换,也不进行其他修改。这是一个非常简单的配置。

问题一定出在kibana或elasticsearch的某个地方。

关于如何解决这个问题有什么想法吗? *注意:同样的问题发生在 docker 容器中。

屏幕截图如下:

时间:准确。

SMF30DTE 字段:晚了一天,包括不应该存在的时间。

SMF30TME:准确。

这是我的 logstash 过滤器:

filter {
    split {
    }
    mutate { 
        add_field => {"[@metadata][indexname]" => "%{[sourceType]}-%{[sysplexName]}"}
    }
    mutate { 
        lowercase => [ "[@metadata][indexname]" ]
    }
    if [source] =~ "table" {
        csv{ columns => [  "Correlator", "SMF30LEN", "SMF30SEG", "SMF30FLG", "SMF30RTY","<shortened for ease of reading>" ]
        separator => "," }
    }
}

我对这些技术不是很熟悉,但问题似乎出在 Logstash 没有仅日期解析。相反,它在解析期间采用午夜 UTC,然后 Kibana 根据您当地的时区显示它。有 an open GitHub issue on this,其他人已经提到了您描述的问题。

我还找到了一些关于如何调整 Kibana 时区的信息here。您可以尝试设置 Kibana 的时区以与您的源输入对齐。当然,所有其他时间戳也将采用 UTC。

或者,您可以尝试在 Logstash 日期过滤器中设置 timezone => "America/Chicago"。虽然这只会帮助从美国中部时间观看。

Elasticseach 中存储的所有日期都是 UTC 时间,当您使用 Kibana 可视化 elasticsearch 数据时,默认情况下,它会将 UTC 时间转换为对应的浏览器时区。

由于您的字段 SMF30DTE 只有 YYYY-MM-DD 格式的日期,它将被索引为 UTC 时间日期的午夜,因此 2019-11-15 将被索引作为 2019-11-15 00:00:00.000 并将根据您的浏览器时区显示在 Kibana 中,这似乎是 UTC -0600 因为您看到的日期是 2019-11-14 18:00:00.000

我认为 Kibana 目前不支持显示没有时间的日期字段,因此要解决您的问题,您可以使用 mutate 过滤器向您的字段添加时间,然后使用 date 过滤器将其转换为您的时区,如下所示:

mutate {
    add_field => { "SMF30DTE" => "%{SMF30DTE} 00:00:00.000" }
}
date {
    match => [ "SMF30DTE", "YYYY-MM-dd HH:mm:ss.SSS"]
    target => "SMF30DTE"
    timezone => "-0600"
}

这至少应该使您的日期在 kibana 中显示为正确的日期。

另一种选择是为您的索引创建映射并将字段 SMF30DTE 映射为字符串,而不是让 elasticsearch 执行动态映射,但这样您将看到值 2019-11-15 ,除非您使用 mutate and date 过滤器的组合将字符串更改为 November 15th, 2019