2016-02-16 3 views
0

Я пытаюсь упростить конфигурацию logstash. Я хочу разделить поле программы на отдельные поля (как показано ниже), однако я бы предпочел использовать только один запрос grok (если это вообще возможно!)logstash add_field и remove_field

Из двух приведенных ниже примеров я получаю сообщение об ошибке _grokparsefuse во втором примере , но не первый. Поскольку у grok есть опции add_field и remove_field, я бы предположил, что я мог бы объединить все это в один оператор grok. Почему это не так? Я пропустил какой-то порядок/синтаксис?

Образец журнала:

2016-02-16T16:42:06Z ubuntu docker/THISTESTNAME[892]: 172.16.229.1 - - [16/Feb/2016:16:42:06 +0000] "GET/HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36" "-" 

Почему это работает:

filter { 

     # Extracts the docker name, ID, image etc elements 
     mutate { 
       add_field => { "[@metadata][program]" => "%{program}" } 
       remove_field => "[program]" 
     } 

     grok { 
       patterns_dir => "/logstash/patterns_dir/docker" 
       match => { "[@metadata][program]" => "%{D_ID}" } 
     } 

} 

Но это вовсе не так:

filter { 

     grok { 
       add_field => { "[@metadata][program]" => "%{program}" } 
       remove_field => "[program]" 
       patterns_dir => "/logstash/patterns_dir/docker" 
       match => { "[@metadata][program]" => "%{D_ID}" } 
     } 

} 

ответ

1

add_field и remove_field работать только, если основной фильтр работает. В вашем втором примере [@metadata] [program] еще не существует для запуска grok {}.

+0

Да, это таким образом, если бы я настаивал на том, что путь, и только используя метод grok, логически можно было бы сделать это (хотя первый урок возвращает ошибку, поскольку совпадений не было): grok { add_field => {"[@metadata] [program]" => "% { program} "} remove_field =>" [program] " } //// grok { patterns_dir = > "/ logstash/patterns_dir/docker" match => {"[@metadata] [program]" => "% {D_ID}"} } – geekscrap

+0

Использование мутата для добавления поля, а затем с помощью grok в порядке и лучше понять синтаксис, чем использовать grok, чтобы просто запустить add_field и remove_field. –

0

Это непосредственно отвечает @Alan, однако я нашел этот путь немного более читаемым и прессуют мой код еще больше:

grok { 
    patterns_dir => "/logstash/patterns_dir/docker-patterns" 
    match => { "program" => "%{D_ID}" } 
    overwrite => [ "program" ] 
} 
Смежные вопросы