2

我是弹性搜索的新手,花了很长时间试图解决下面的问题。也许解决方案应该在文档中 - 但它不是:-(

我有在多个时区运行的服务器。

日志文件被同步到具有不同时区的服务器中,但是很容易通过时区字段(例如 {"timezone": "UTC"})或时间格式本身(例如 {"@timestamp": “2015-02-20T12:11:56.789Z”}

我可以完全控制日志文件,并且可以在必要时调整它们。

使用 logstash 时 - 它将时间格式更改为运行它的服务器的本地时间。例如“@timestamp”=>“2015-02-21T22:26:24.920-08:00”

如何通过日志存储和弹性搜索始终从源日志文件中获取时区?(显然 - 在那之后我想在 Kibana 中拥有它)。我尝试了很多事情都没有成功。

提前致谢。

4

1 回答 1

3

我的目标是在其中包含日志记录时间的弹性搜索中创建 _id - 这样即使通过 logstash 再次发送日志,它也永远不会重复

在解决这个问题几个小时后 - 我有一些结论,就我而言,没有足够好的文档记录,并建议解决。

1)如果日志文件的格式中有时区 - 在logstash中无法修改它。因此 - 不要在时区或部分匹配或添加时区上浪费时间。如果时间末尾有 Z - 那么它将是 GMT。我认为这是一个错误,当这种情况发生时 - 不会发出警告。

2) 无论输入字符串的格式如何,Logstash 都以本地时间的时间输出到标准输出/文件。

3) Logstash 使用其本地时间的时间 - 因此将时间连接到变量中会变得混乱 - 即使原始字符串是 GMT。所以甚至不要尝试使用 @timestamp 变量!

4)弹性搜索在格林威治标准时间工作 - 所以它表现得很好。因此,您在 logstash 的输出中看到的 "@timestamp" => "2015-02-21T20:26:24.921-08:00" 被弹性搜索正确解释为 "@timestamp" => "2015-02-21T12 :26:24.921Z"

所以我的工作如下:1) 使用不是@timestamp 的时间戳保存日志 2) 始终将日志文件中的时间保存为 GMT 并用尾随 Z 标记它们 3) 以最基本的形式使用日期过滤器。没有时区属性

filter {
    date {
        match => ["log_time", "YYYY-MM-dd'T'HH:mm:ss.SSSZ"]
        #timezone => "Etc/GMT-8" <--- THIS DOES NOT WORK IF THERE IS A Z IN SOURCE
    }   
}

4)直接从日志变量创建时间导数 - 而不是从@timestamp。例如

output {
    stdout { codec => rubydebug }
    elasticsearch { 
        host => localhost
        document_id => "%{log_time}-%{host}" # <--- DO THIS
        # document_id => "%{@timestamp}-%{host}" <--- DON'T DO THIS
    }   
}

如果 Jordan Sissel 碰巧读到了这篇文章——我认为默认情况下,logstash 应该与 elasticsearch 一致——或者至少可以选择在 GMT 内部输出和工作。在第一次使用现有日志尝试该工具时,我开始做每个人都会经历的事情。

于 2015-02-23T13:32:06.090 回答