我的目标是在其中包含日志记录时间的弹性搜索中创建 _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 内部输出和工作。在第一次使用现有日志尝试该工具时,我开始做每个人都会经历的事情。