使用Logstash指定比当前日期早的Elasticsearch索引名称的方法
想做的事情
将Elasticsearch的索引命名为logstash-%{+YYYYMMdd},并使用curator进行数据的轮转。
在之前使用elasticsearch的logstash进行数据处理时,我遇到了这样一种情况,即我想要更新/合并具有相同ID的数据(使用update和doc_as_upsert方法)。对于要更新的数据,我想要将其更新到一天前的日期索引中,而不是当前索引。
在logstash中尝试指定非当前日期的索引名称时,经过调查发现需要进行一些改进,因此将其作为备忘录留下。
在中文中,通常指定logstash的索引名称的方法是什么?
将logstash的output配置如下:
在index位置添加当前日期(UTC)的YYYYMMdd,并赋予相应的索引名称。
output {
elasticsearch {
hosts => [ "ElasticsearchのIPアドレス:9200" ]
index => "logstash-%{+YYYYMMdd}"
}
}
指定古老日期作为索引名称的方法
根据以下的参考信息,我想将设定更改为当前日期的前一天(UTC时间)来更新数据。
Elasticsearch输出插件的索引说明。
https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-index
LS使用Joda来格式化事件时间戳的索引模式。
YYYYMMdd的部分是从elasticsearch的@timestamp字段中获取的。
不是从系统时间获取的。
尽管有格式,但没有提到如何调整时间的方法。
将Logstash输出的索引名称与旧日期联系起来
https://discuss.elastic.co/t/logstash-output-indexname-with-old-date/123433
这里还解释了YYYYMMdd部分是从elasticsearch的@timestamp字段中获取的。
要指定旧日期的索引,可以覆盖@timestamp字段或使用@metadata字段的方法。
后者作为一个插件,有一个名为logstash-filter-date_formatter的链接。
Elasticsearch的时区问题
https://qiita.com/hssh2_bin/items/0c4cbd1157ea230549a9
通过使用@metadata进行配置示例,使用ruby过滤插件生成日期并将其注入@metadata中。
作为实际的示例,我几乎照搬了这个网站的设置。
实际的设定示例
在当前日期的前一个小时的日期上指定一个索引名称。
由于在ruby过滤器中可以直接编写ruby代码,因此可以使用它来获取前一个小时的日期,并使用@metadata将其用作输出的索引。
以下是对来自https://qiita.com/hssh2_bin/items/0c4cbd1157ea230549a9的说明引用和设置示例的补充,并解决了Elasticsearch的时区问题。
在Ruby的filter上使用event.set命令创建了一个(field,value)的字段。字段名称被设定为[@metadata][local_time],通过添加[@metadata]前缀可以将其设置为不被Elasticsearch索引的字段。通过strftime(‘%Y-%m-%d’)将获取到的时间转换为字符串。
補充 1:在以下的設置例中,將其指定為[@metadata][delay_date]。
補充 2:在以下的設置例中,將其指定為(‘%Y%m%d’)。有關strftime日期格式的詳細說明,請參考這個參考資料。
在以下链接中使用的Ruby Time的参考资料:https://docs.ruby-lang.org/ja/latest/class/Time.html
根据参考资料得知,Time似乎返回的是本地时间,
因此在下面的示例中,为了将其与UTC对齐,我在strftime之前放置了getutc进行转换。
※因为”logstash-%{+YYYYMMdd}”是根据当前方向的索引,所以它是UTC时间。
filter {
ruby {
code => "
t = Time.now;
t2 = t - ( 60 * 60 );
event.set('[@metadata][delay_date]',t2.getutc.strftime('%Y%m%d'))"
}
}
output {
elasticsearch {
hosts => [ "ElasticsearchのIPアドレス:9200" ]
index => "logstash-%{[@metadata][delay_date]}"
}
}