Анализ даты Logstash как метка времени с использованием фильтра даты

Что ж, после долгого осмотра я не смог найти решение своей проблемы, так как оно «должно» работать, но, очевидно, нет. Я использую на машине Ubuntu 14.04 LTS Logstash 1.4.2-1-2-2c0f5a1, и я получаю сообщения, такие как следующее:

2014-08-05 10:21:13,618 [17] INFO  Class.Type - This is a log message from the class:
  BTW, I am also multiline

Во входной конфигурации у меня естьmultiline кодек и событие анализируется правильно. Я также разделяю текст события на несколько частей, чтобы его было легче читать.

В конце я получаю, как видно из Kibana, что-то вроде следующего (представление JSON):

{
  "_index": "logstash-2014.08.06",
  "_type": "customType",
  "_id": "PRtj-EiUTZK3HWAm5RiMwA",
  "_score": null,
  "_source": {
    "@timestamp": "2014-08-06T08:51:21.160Z",
    "@version": "1",
    "tags": [
      "multiline"
    ],
    "type": "utg-su",
    "host": "ubuntu-14",
    "path": "/mnt/folder/thisIsTheLogFile.log",
    "logTimestamp": "2014-08-05;10:21:13.618",
    "logThreadId": "17",
    "logLevel": "INFO",
    "logMessage": "Class.Type - This is a log message from the class:\r\n  BTW, I am also multiline\r"
  },
  "sort": [
    "21",
    1407315081160
  ]
}

Возможно, вы заметили, что я поставил ";" в метке времени. Причина в том, что я хочу иметь возможность сортировать журналы, используя строку метки времени, и, очевидно, logstash не так хорош в этом (например:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/multi-fields.html).

Я безуспешно пытался использоватьdate фильтровать несколькими способами, и это, видимо, не работает.

date {
            locale => "en"
            match => ["logTimestamp", "YYYY-MM-dd;HH:mm:ss.SSS", "ISO8601"]
            timezone => "Europe/Vienna"
            target => "@timestamp"
            add_field => { "debug" => "timestampMatched"}
        }

Так как я прочитал, что библиотека Jodaможет возникли проблемы, если строка не соответствует стандарту ISO 8601 (очень требовательна и ожидает T, см.https://logstash.jira.com/browse/LOGSTASH-180) Я тоже пытался использоватьmutate преобразовать строку во что-то вроде2014-08-05T10:21:13.618 а затем использовать"YYYY-MM-dd'T'HH:mm:ss.SSS", Это тоже не сработало.

Я не хочу вручную ставить +02: 00 на время, потому что это создаст проблемы с переходом на летнее время.

В любом из этих случаев событие переходит кdate видимо ничего не делает, как@timestamp а такжеlogTimestamp разные и нетdebug поле добавлено.

Любая идея, как я мог бы сделать строки logTime правильно сортируемыми? Я сосредоточился на преобразовании их в правильную временную метку, но любое другое решение также будет приветствоваться.

Как вы можете видеть ниже:

При сортировке@timestamp,asticsearch может сделать это правильно, но поскольку это не «реальная» временная метка журнала, а скорее когда было прочитано событие logstash, мне нужно (очевидно), чтобы иметь возможность сортировать и поlogTimestamp, Это то, что потом выводится. Очевидно, что это не полезно:

Любая помощь приветствуется! Просто дайте мне знать, если я забыл некоторую информацию, которая может быть полезной.

Обновить:

Вот файл конфигурации фильтра, который наконец заработал:

# Filters messages like this:
# 2014-08-05 10:21:13,618 [17] INFO  Class.Type - This is a log message from the class:
#  BTW, I am also multiline

# Take only type- events (type-componentA, type-componentB, etc)
filter {
    # You cannot write an "if" outside of the filter!
    if "type-" in [type] {
        grok {
            # Parse timestamp data. We need the "(?m)" so that grok (Oniguruma internally) correctly parses multi-line events
            patterns_dir => "./patterns"
            match => [ "message", "(?m)%{TIMESTAMP_ISO8601:logTimestampString}[ ;]\[%{DATA:logThreadId}\][ ;]%{LOGLEVEL:logLevel}[ ;]*%{GREEDYDATA:logMessage}" ]
        }

        # The timestamp may have commas instead of dots. Convert so as to store everything in the same way
        mutate {
            gsub => [
                # replace all commas with dots
                "logTimestampString", ",", "."
                ]
        }

        mutate {
            gsub => [
                # make the logTimestamp sortable. With a space, it is not! This does not work that well, in the end
                # but somehow apparently makes things easier for the date filter
                "logTimestampString", " ", ";"
                ]
        }

        date {
            locale => "en"
            match => ["logTimestampString", "YYYY-MM-dd;HH:mm:ss.SSS"]
            timezone => "Europe/Vienna"
            target => "logTimestamp"
        }
    }
}

filter {
    if "type-" in [type] {
        # Remove already-parsed data
        mutate {
            remove_field => [ "message" ]
        }
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос