我的logstash实例每天都会创建一个新目录来存储其日志。配置文件如下。它似乎在一天的早上创建了一个目录(并开始使用它);而不是在午夜之后创建它(当日期实际发生变化时)。我在西海岸(UTC-08:00)。我在OEL操作系统上。
配置:
input {
udp {
port => 6379
}
}
filter {
ruby {
code => "event['@timestamp'] = event['@timestamp'].localtime('-08:00')"
}
}
output {
file {
path => ["/logstash-1.4.1/logs/%{+YYYY-MM-dd}/logstash_in.txt"]
}
elasticsearch {
protocol => http
}
stdout {
codec => rubydebug
}
}
我的系统日期和时间是正确的:
[root@xxx]# date
Mon Jul 14 18:22:37 PDT 2014
答案 0 :(得分:1)
简而言之,文件输出路径时间戳%{+YYYY-MM-dd}
是指UTC时间。
这意味着您的目录将在晚上创建。
对于长答案,您可以参考file output source code。路径是
path = event.sprintf(@path)
并向下钻取到event.rb
t = @data["@timestamp"]
formatter = org.joda.time.format.DateTimeFormat.forPattern(key[1 .. -1])\
.withZone(org.joda.time.DateTimeZone::UTC)
#next org.joda.time.Instant.new(t.tv_sec * 1000 + t.tv_usec / 1000).toDateTime.toString(formatter)
# Invoke a specific Instant constructor to avoid this warning in JRuby
# > ambiguous Java methods found, using org.joda.time.Instant(long)
org.joda.time.Instant.java_class.constructor(Java::long).new_instance(
t.tv_sec * 1000 + t.tv_usec / 1000
).to_java.toDateTime.toString(formatter)
路径参数%{+YYYY-MM-dd}
基于UTC时间:(org.joda.time.DateTimeZone::UTC)
。
因此,有两种解决方案可以满足您的需求,
a)修改event.rb以使用您的时区,而不是UTC。
b)创建您自己的日期字段并使用您特定的字段%{+YYYY-MM-dd}
这是我的配置:
filter {
ruby {
code => "
ownTime = event['@timestamp'].localtime('-08:00')
event['day'] = ownTime.strftime('%Y-%m-%d')
"
}
}
output {
file {
path => "/logstash-1.4.1/logs/%{day}/logstash_in.txt"
}
stdout {
codec => "rubydebug"
}
}
希望这可以帮到你。
答案 1 :(得分:1)
如果您想根据时区的名称转换时区:
filter {
date {
match => [ "@timestamp", "ISO8601" ]
timezone => "America/New_York"
}
}