Logstash создает каталог слишком рано

Мой экземпляр logstash каждый день создает новый каталог для хранения его журналов. Конфигурационный файл находится ниже. Кажется, вы создаете каталог (и начинаете его использовать) вечером на день раньше; в отличие от создания его сразу после полуночи (когда дата действительно меняется). Я на западном побережье (UTC−08:00). Я на OEL OS.

Конфигурация:

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 ответа

Решение

Для краткого ответа, временная метка пути вывода файла %{+YYYY-MM-dd} это относится к времени UTC. Это означает, что ваш каталог будет создан в ваше вечернее время.

Для длинного ответа вы можете обратиться к файлу с исходным кодом. Путь

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),

Итак, есть два решения, чтобы сделать то, что вам нужно,

а) Измените event.rb, чтобы использовать ваш часовой пояс вместо UTC.

б) Создайте собственное поле дня и используйте это поле, которое вы %{+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"
    }
}

Надеюсь, это поможет вам.

Если вы хотите преобразовать часовой пояс на основе имени часового пояса:

filter {
  date {
    match => [ "@timestamp", "ISO8601" ]
    timezone => "America/New_York"
  }
}
Другие вопросы по тегам