Фильтрация ввода Filebeat с или без Logstash - PullRequest
0 голосов
/ 17 апреля 2020

В нашей текущей настройке мы используем Filebeat для отправки журналов в экземпляр Elasticsearch. Журналы приложений имеют формат JSON и работают в AWS.

. По какой-то причине AWS решил добавить префикс строк журнала в новую версию платформы, и теперь анализ журнала не работает .

Apr 17 06:33:32 ip-172-31-35-113 web: {"@timestamp":"2020-04-17T06:33:32.691Z","@version":"1","message":"Tomcat started on port(s): 5000 (http) with context path ''","logger_name":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer","thread_name":"main","level":"INFO","level_value":20000}

Прежде чем это было просто:

{"@timestamp":"2020-04-17T06:33:32.691Z","@version":"1","message":"Tomcat started on port(s): 5000 (http) with context path ''","logger_name":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer","thread_name":"main","level":"INFO","level_value":20000}

Вопрос заключается в том, можем ли мы избежать использования Logsta sh для преобразования строк журнала в старый формат? Если нет, как мне сбросить префикс? Какой фильтр является лучшим выбором для этого?

Моя текущая конфигурация Filebeat выглядит следующим образом:

 filebeat.inputs:
  - type: log
    paths:
    - /var/log/web-1.log
    json.keys_under_root: true
    json.ignore_decoding_error: true
    json.overwrite_keys: true
    fields_under_root: true
    fields:
      environment: ${ENV_NAME:not_set}
      app: myapp

  cloud.id: "${ELASTIC_CLOUD_ID:not_set}"
  cloud.auth: "${ELASTIC_CLOUD_AUTH:not_set}"

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Я бы попытался использовать процессоры dissect и decode_json_fields:

processors:
  # first ignore the preamble and only keep the JSON data
  - dissect:
      tokenizer: "%{?ignore} %{+ignore} %{+ignore} %{+ignore} %{+ignore}: %{json}"
      field: "message"
      target_prefix: ""

  # then parse the JSON data
  - decode_json_fields:
      fields: ["json"]
      process_array: false
      max_depth: 1
      target: ""
      overwrite_keys: false
      add_error_key: true
0 голосов
/ 17 апреля 2020

В Logsta имеется плагин sh, называемый JSON filter , который включает всю необработанную строку журнала в поле, называемом «message» (например).

filter {
    json {
        source => "message"
    }
}

Если вы не хотите включать начальную часть строки, используйте фильтр рассечения в Logsta sh. Это будет что-то вроде этого:

filter {
    dissect {
        mapping => {
            "message" => "%{}: %{message_without_prefix}"
         }
    }
}

Может быть, в Filebeat также доступны эти две функции. Но по моему опыту, я предпочитаю работать с Logsta sh при разборе / манипулировании данными журналов.

...