#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» отсутствуют. И я все еще не вижу «уровень» : (. Можете ли вы, пожалуйста, помочь