我是弹性搜索的新手,并且花了很长时间试图解决下面的问题。也许解决方案应该在文档中 - 但它不是: - (
我的服务器在多个时区运行。
日志文件会被发送到具有不同时区的服务器,但很容易通过时区字段来了解原始时区。 {“timezone”:“UTC”}或时间格式本身,例如{“@ timestamp”:“2015-02-20T12:11:56.789Z”}
我可以完全控制日志文件,并在必要时对其进行调整。
使用logstash时 - 它会将时间格式更改为运行它的服务器的本地时间。例如“@timestamp”=> “2015-02-21T22:26:24.920-08:00”
如何从源日志文件,日志存储和弹性搜索中获取时区? (显然 - 之后我想在Kibana有它)。我尝试过很多事情都没有成功。
提前致谢。
答案 0 :(得分:3)
我的目标是在elasticsearch中创建具有日志记录时间的_id,这样即使通过logstash再次发送日志也不会重复它
在针对这个问题再多花了几个小时之后 - 我得出一些结论,据我所知,记录不够好,并建议解决。
1)如果日志文件的格式中包含时区 - 在logstash中没有任何操作可以修改它。因此 - 不要在时区或部分匹配或添加时区上浪费时间。如果时间结束时有Z,那么它将是GMT。我认为这是一个错误,当发生这种情况时 - 没有发出警告。
2)无论输入字符串的格式如何,Logstash都会以当地时间输出到标准输出/文件。
3)Logstash在本地时间使用时间 - 因此将时间连接到变量中会搞砸 - 即使原始字符串是GMT。所以,甚至不要尝试使用@timestamp变量!!!
4)弹性搜索在GMT中起作用 - 因此它的行为正常。所以你在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创建。 e.g。
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应该与弹性搜索一致作为默认值 - 或者至少可以选择在GMT内部输出和工作。当用现有的日志第一次尝试这个工具时,每个人都经历了一个艰难的开始。