Добавить поле уровня log4net в файл logstash.conf

#logstash #logstash-configuration

#logstash #logstash-конфигурация

Вопрос:

Я пытаюсь добавить поле уровня (чтобы оно отображалось в Kibana). Мой logstash.conf

Ввод:

 2018-03-18 15:43:40.7914 - INFO: Tick 
2018-03-18 15:43:40.7914 - ERROR: Tock
  

файл:

 input {
  beats {
    port => 5044
  }
}
filter {
  grok {      
      match => { 
            "message" => "(?m)^%{TIMESTAMP_ISO8601:timestamp}~~[%{DATA:thread}]~~[%{DATA:user}]~~[%{DATA:requestId}]~~[%{DATA:userHost}]~~[%{DATA:requestUrl}]~~%{DATA:level}~~%{DATA:logger}~~%{DATA:logmessage}~~%{DATA:exception}||"
        }
      match => {
        "levell" => "(?m)^%{DATA:level}"
      }
      add_field => { 
        "received_at" => "%{@timestamp}" 
        "received_from" => "%{host}"
        "level" => "levell"
      }
      remove_field => ["message"]      
    }
  date {
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss:SSS" ]
  }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    sniffing => true
    index => "filebeat-%{ YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
    #user => "elastic"
    #password => "changeme"
  }
  stdout { codec => rubydebug }
}
  

при этом выводится «levell» вместо «INFO / ERROR» и т. Д

РЕДАКТИРОВАТЬ: Ввод:

 2018-03-18 15:43:40.7914 - INFO: Tick 
  

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

 # Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  beats {
    port => 5044
  }
}
filter {
  grok {      
      match => { "message" => "(?m)^%{TIMESTAMP_ISO8601:timestamp}~~[%{DATA:thread}]~~[%{DATA:user}]~~[%{DATA:requestId}]~~[%{DATA:userHost}]~~[%{DATA:requestUrl}]~~%{DATA:level}~~%{DATA:logger}~~%{DATA:logmessage}~~%{DATA:exception}||" }
      add_field => { 
        "received_at" => "%{@timestamp}" 
        "received_from" => "%{host}"
      } 
    }
  grok {      
      match => { "message" => "- %{LOGLEVEL:level}" }
      remove_field => ["message"]      
    }
  date {
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss:SSS" ]
  }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    sniffing => true
    index => "filebeat-%{ YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
    #user => "elastic"
    #password => "changeme"
  }
  stdout { codec => rubydebug }
}
  

Результат, который я получаю. По-прежнему отсутствуют received_at и level:
введите описание изображения здесь

Ответ №1:

В этой части конфигурации:

   add_field => { 
    "received_at" => "%{@timestamp}" 
    "received_from" => "%{host}"
    "level" => "levell"
  }
  

При использовании "level" => "levell" вы просто помещаете строку levell в поле level . Чтобы поместить значение поля с именем levell , вы должны использовать %{levell} . Итак, в вашем случае это будет выглядеть так:

   add_field => { 
    "received_at" => "%{@timestamp}" 
    "received_from" => "%{host}"
    "level" => "%{levell}"
  }
  

Также grok#match , согласно документации:

Хэш, который определяет сопоставление того, где искать, и с какими шаблонами.

Таким образом, попытка сопоставления по levell полю не сработает, поскольку похоже, что оно еще не существует. И шаблон grok, который вы используете для сопоставления с message полем, не соответствует приведенному вами примеру.

Комментарии:

1. Так должно ли это быть тогда? уровень» => «%{DATA:level}»

2. В каком фильтре? Если это для фильтра grok, ключом ( level в комментарии, который вы опубликовали) является имя поля; поле должно существовать, прежде чем использоваться в фильтре.

3. Итак, как мне заставить это работать так, чтобы «ОШИБКА» в этой строке: 2018-03-18 15:43:40.7914 — ОШИБКА: Ток, сохранена в level?

4. grok { match => { "message" => "- %{LOGLEVEL:level}" }}

5. пожалуйста, посмотрите «РЕДАКТИРОВАТЬ», все еще не удается заставить это работать, и теперь «received_at» и «received_from» отсутствуют. И я все еще не вижу «уровень» : (. Можете ли вы, пожалуйста, помочь