Как я могу проверить, содержит ли путь к файлу моего журнала определенную строку в конфигурации logstash с помощью регулярного выражения?

Я использую filebeat для отправки журналов в logstash в зависимости от их имени файла - эти журналы отправляются в определенные индексы в elasticsearch. Filebeat работает хорошо, logstash получает файлы журнала, но я не могу получить регулярное выражение в моей конфигурации logstash, чтобы проверить, содержат ли имена файлов определенную рабочую строку.

Вот как выглядит моя конфигурация logstash

input {
    beats {
      port => 5044
    }
}
filter {
    csv {
        separator => ","
        columns => ["Order ID","Status","Remarks"]
    }
}
output {
    if [source] =~ "/path/to/my/logs/log-file-1*.csv" {
        stdout {}
    }
    else if [source] =~ "/path/to/my/logs/log-file-2*.csv" {
        stdout {}
    }
    else if [source] =~ "/path/to/my/logs/log-file-3*.csv" {
        stdout {}
    }
    else if [source] =~ "/path/to/my/logs/log-file-4*.csv" {
        stdout {}
    }
}

Я удалил часть, которая отправляет в elasticsearch. Я ожидаю, что вывод данных будет напечатан на стандартный вывод, но его нет.

Правильно ли я ссылаюсь на [источник]?


person Vus'muzi Sibanyoni    schedule 08.08.2019    source источник


Ответы (3)


Вы пытались добавить $ в конце регулярных выражений ?. Скорее всего, дело в проблеме с регулярным выражением.

Например, проверьте это:

if [source] =~ "/path/to/my/logs/log-file-1*.csv$"

Другое решение:

if [source] =~ "/path/to/my/logs/log-file-1(.*).csv$"
person Alexadreison    schedule 08.08.2019
comment
Привет, Alexadreison, я попробовал ваш метод, он не работает. - person Vus'muzi Sibanyoni; 10.08.2019

Спасибо за вашу помощь, ребята, но мне удалось решить проблему с помощью параметра / параметра [fields] внутри моего filebeat.yml, а затем получить доступ к [fields] внутри моей конфигурации logstash как часть условия.

Вот как выглядит мой filebeat.yml:

- type: log

  enabled: true

  paths:
    - /path/to/my/logs/log-file-1*

  fields: {target_index: log-index-1}

- type: log

  enabled: true

  paths:
    - /path/to/my/logs/log-file-2*

  fields: {target_index: log-index-2}

... а затем мой файл конфигурации logstash:

output {
    if [fields][target_index] == "log-index-1" {
        elasticsearch {
            # post to specific index
        }
        stdout {}
    }
    else if [fields][target_index] == "log-index-2" {
        elasticsearch {
            # post to specific index
        }
        stdout {}
    }

Если у меня есть еще какие-либо предложения по оптимизации, пожалуйста, дайте мне знать.

person Vus'muzi Sibanyoni    schedule 10.08.2019

Вам нужно написать свое регулярное выражение между /, а не " и экранировать / в своем шаблоне следующим образом: \/. В ваших случаях ваше регулярное выражение должно выглядеть так:

if [source] =~ /\/path\/to\/my\/logs\/log-file-1*.csv/ {
    stdout {}
}
else if [source] =~ /\/path\/to\/my\/logs\/log-file-2*.csv/ {
    stdout {}
}
else if [source] =~ /\/path\/to\/my\/logs\/log-file-3*.csv/ {
    stdout {}
}
else if [source] =~ /\/path\/to\/my\/logs\/log-file-4*.csv/ {
    stdout {}
}
person baudsp    schedule 08.08.2019
comment
Привет, Baudsp, спасибо за ответ. Я только что попробовал ваш метод - он по-прежнему дает тот же результат, не могли бы вы объяснить актуальность заголовка ## ##? - person Vus'muzi Sibanyoni; 10.08.2019
comment
@ Vus'muziSibanyoni ## Заголовок ## был добавлен ошибочным щелчком, извините за это. Редактирую вне ответа. Вот что происходит, когда я не тестирую свои конфиги :( - person baudsp; 12.08.2019