Вывод микса Logstash при использовании двух файлов конфигурации

Я использую logstash 1.5.6 в Ubuntu.

Я написал два конфигурационных файла в /etc/logstash/conf.d, указав разные места ввода/вывода:

Файл А:

input {
  file {
    type => "api"
    path => "/mnt/logs/api_log_access.log"
  }
}
filter {
  ...
}
output {
  if "_grokparsefailure" not in [tags] {
      elasticsearch {
        host => "localhost"
        protocol => "http"
        index => "api-%{+YYYY.MM.dd}"
        template => "/opt/logstash/template/api_template.json"
        template_overwrite => true
      }
  }
}

Файл Б:

input {
  file {
    type => "mis"
    path => "/mnt/logs/mis_log_access.log"
  }
}
filter {
  ...
}
output {
  if "_grokparsefailure" not in [tags] {
      elasticsearch {
        host => "localhost"
        protocol => "http"
        index => "mis-%{+YYYY.MM.dd}"
        template => "/opt/logstash/template/mis_template.json"
        template_overwrite => true
      }
  }
}

Однако я могу видеть данные из /mnt/logs/mis_log_access.log и /mnt/logs/nginx/dmt_access.log, показанные в индексах api-%{+YYYY.MM.dd} и mis-%{+YYYY.MM.dd}, чего я не хотел.

Что не так с конфигурацией? Спасибо.


person xi.lin    schedule 29.12.2015    source источник


Ответы (2)


Logstash читает все файлы в вашем каталоге конфигурации и объединяет их все вместе в одну конфигурацию.

Чтобы заставить один фильтр или раздел вывода работать только для одного типа ввода, используйте условные операторы:

if [type] == "api" {
   ....
}
person Alain Collins    schedule 29.12.2015
comment
Спасибо! Так что для выходной части менять не надо? - person xi.lin; 29.12.2015
comment
Выходные разделы также могут быть защищены условными выражениями. - person Alain Collins; 29.12.2015
comment
Эластичные ребята планируйте избавиться от атрибута типа, и он также не будет применяться, если у вас уже есть поле типа в вашем источнике (оно не переопределяет). Поэтому я советую вместо этого использовать теги или add_field. - person BornToCode; 21.06.2017
comment
@BornToCode Этот атрибут type имеет другое значение по сравнению с этим — это дискриминатор между типами документов в одном и том же индексе Elasticsearch, тогда как это атрибут типа, переносимый в конвейере Logstash. Это может в конечном итоге появиться как поле type в документе Elasticsearch, но фактический документ Elasticsearch type (указанный с помощью output { elasticsearch { document_type =› ... } } - который не заполняется автоматически из типа Logstash), сохраняется с префиксом подчеркивания. - person jmb; 02.08.2017

Он лучше обрабатывает фильтры с типом ввода

Файл А:

input {
   file {
     type => "api"
     path => "/mnt/logs/api_log_access.log"
     }
 }

   if [type] == "api" {
     filter {
      ...
     }
   }

Файл Б:

input {
 file {
    type => "mis"
    path => "/mnt/logs/mis_log_access.log"
  }
 }

   if [type] == "mis" {
     filter {
      ...
     }
   }

Файл C: output.conf

output {
  elasticsearch {
  hosts => ["localhost:9200"]
  index => "%{type}-%{+YYYY.MM.dd}"
  }
}

работа с логсташем 5.1

person Waruna C. Senavirathna    schedule 30.12.2016
comment
Спасибо за ваши советы. - person xi.lin; 03.01.2017
comment
Эластичные ребята планируйте избавиться от атрибута типа, и он также не будет применяться, если у вас уже есть поле типа в вашем источнике (оно не переопределяет). Поэтому я советую вместо этого использовать теги или add_field. - person BornToCode; 21.06.2017
comment
В моем случае, в logstash 7.11.1, мне нужно было поместить предложенный оператор if внутри блока фильтра и вывода из-за ошибки синтаксического анализа во время запуска logstash. - person fl4l; 18.03.2021