2015-07-20 3 views
3

У меня есть клиент и сервер logstash.
Клиент отправляет лог-файлы с выходом udp логсташа на сервер, и сервер также запускает logstash для получения этих журналов. На сервере у меня есть json-фильтр, который вытаскивает форматированное сообщение json в полях фактического журнала, так что elasticsearch может их индексировать.Logstash delete type and keep _type

Вот мой код с сервера:

input{ 
    udp{} 
} 

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

output{ 
    elasticsearch{ 
    } 
} 

И от клиента:

input{ 
    file{ 
    type => "apache-access" 
    path => "/var/log/apache2/access.log" 
    } 
} 

output{ 
    udp{ 
    host => "192.168.0.3" 
    } 
} 

Этот код работает отлично, за исключением одной вещи:
В некотором смысле я получаю поле type дважды , один раз как type и один раз как _type, у них одинаковое содержание.

Я пытался удалить type -поле с mutate k-фильтра, как это:

mutate{ 
    remove_field => [ "type" ] 
} 

, но этот фильтр удаляет как type поля (_type поле устанавливается по умолчанию: журналы).

Как сохранить поле _type и удалить поле type?

+0

хороший вопрос .... –

+0

Можете ли вы дать полный файл конфигурации logstash ... –

+0

@AnilkumarBathula Это все что важно, в полном файле конфигурации есть только больше входов, другой udp-порт и фильтр, который не связан с этой проблемой: 'mutate {add_field => {" program "=>" apache "}}' – Klaus

ответ

2

Это работает для меня таким образом:

input { 
    file { 
     add_field => { "[@metadata][type]" => "apache-access" } 
     path => "/var/log/apache2/access.log" 
    } 
} 

filter { 
    ...... 
    if [@metadata][type] == "xxx" { 

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

@metadata и document_type