我正在将我的日志回填到Elasticsearch中。因此,为了按日期在其时间戳中创建索引,我使用date
过滤器,如下所示:
date {
"locale" => "en"
match => ["timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
target => "@timestamp"
}
我正在使用syslog中的日志,而syslog时间戳格式没有年份:
# Syslog Dates: Month Day HH:MM:SS
SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}
因此,在使用日期过滤器后,创建的索引就像logstash-2015.12.26
如果我正在阅读2014年12月26日的日志。因此,由于日志中没有时间戳,因此默认情况下会选择当前年份。
知道如何制作正确的索引吗?
答案 0 :(得分:7)
在Joda Time解析的字符串中没有一年,Logstash当前默认为Logstash进程启动的年份。见github.com/logstash-plugins/logstash-filter-date bug #3。作为临时解决方法,添加临时过滤器以将正确的年份(2014)追加到时间戳字段的末尾,并调整date filter模式以包含YYYY。
filter {
mutate {
replace => ["timestamp", "%{timestamp} 2014"]
}
date {
locale => "en"
match => ["timestamp",
"MMM d HH:mm:ss YYYY",
"MMM dd HH:mm:ss YYYY",
"ISO8601"]
}
}
答案 1 :(得分:1)
您可以使用日期过滤器将日期字符串转换为日期格式。默认情况下,使用日期过滤器时,日志的日期(或日期时间)将覆盖@timestamp。 因此,在您的过滤器中,您不需要定位。如果要将变量字符串转换为日期,则只需使用它。
实施例: match =&gt; [&#34;时间戳&#34;,&#34; MMM d HH:mm:ss&#34;,&#34; MMM dd HH:mm:ss&#34;,&#34; ISO8601&#34;] < / p>
答案 2 :(得分:0)
如果您加载的日志文件在文件名中包含年份,则可以使用grok过滤器提取它,创建一个新字段,其中包含您从syslog中提取的日期以及文件名中的年份。
如何从文件名中提取日期/时间的示例可在此处找到:Logstash: How to use date/time in a filename as an imported field
答案 3 :(得分:0)
使用 ruby 函数,我能够将日期动态设置为上一年(如果日志日期大于当前 YYYY)。读取并计算事件日期以查看其是否大于当前系统日期。如果是,则减去 365 天,并覆盖时间戳。
ruby {
code => 'require "date"
am_date = "%b %d %H:%M:%S"
parsed=DateTime.strptime(event.get("timestamp"), am_date)
m_now=DateTime.now
if parsed>m_now
parsed=parsed-365
else
parsed=parsed
end
event.set("timestamp", parsed.to_s) '
}
这将防止对日期进行任何硬编码。