Logstash创建目录太早了

时间:2014-07-15 01:31:32

标签: linux logging elasticsearch logstash oracle-enterprise-linux

我的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

2 个答案:

答案 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"
  }
}