2014-11-14 2 views
5

У меня есть приложение Java, которое записывает в файл журнала в формате json. Поля, которые входят в журналы, являются переменными. Logstash считывает этот файл журнала и отправляет его в Kibana.Панель терминов Logstash + Kibana без разрыва слов

Я настроил logstash со следующим файлом:

input { 
     file { 
       path => ["[log_path]"] 
       codec => "json" 
     } 
} 

filter{ 
     json { 
       source => "message" 
     } 

     date { 
       match => [ "data", "dd-MM-yyyy HH:mm:ss.SSS" ] 
       timezone => "America/Sao_Paulo" 
     } 
} 

output { 
     elasticsearch_http { 
       flush_size => 1 
       host => "[host]" 
       index => "application-%{+YYYY.MM.dd}" 
     } 
} 

Я сумел показать правильно все в Kibana без отображения. Но когда я пытаюсь создать панель терминов, чтобы показать количество серверов, которые отправили эти сообщения, у меня возникла проблема. У меня есть поле, называемое сервером в моем json, которое показывает имя сервера (например: a1-name-server1), но панель терминов разделяет имя сервера из-за «-». Также я хотел бы подсчитать количество раз, когда появляется сообщение об ошибке, но та же проблема возникает, поскольку панель терминов разделяет сообщение об ошибке из-за пробелов.

Я использую Kibana 3 и Logstash 1.4. Я много искал в Интернете и не нашел решения. Я также пробовал использовать .raw из logstash, но это не сработало.

Как я могу управлять этим?

Спасибо за помощь.

ответ

1

Поскольку вы не определяете отображение в elasticsearch, настройки по умолчанию имеют место для каждого поля вашего типа в вашем индексе. Настройки по умолчанию для строковых полей (например, поля вашего сервера) равны проанализируйте поле, что означает, что поиск по эластичности будет искажать содержимое поля. Вот почему его разделение имен серверов на части.

Вы можете преодолеть эту проблему, определив отображение. Вам не нужно определять все ваши поля, но только те, которые вы не хотите анализировать elasticsearch. В вашем конкретном случае, отправив следующую команду пут будет делать трюк:

http://[host]:9200/[index_name]/_mapping/[type] 

{ 
    "type" : { 
     "properties" : { 
      "server" : {"type" : "string", "index" : "not_analyzed"} 
     } 
    } 
} 

Вы не можете сделать это на уже существующий индекс, так как переход от анализировались на not_analyzed является одним из основных изменений в отображении.

4

Ваша проблема здесь в том, что ваши данные tokenized. Это полезно для любого поиска по вашим данным. ES (по умолчанию) разделит ваше поле message на разные части, чтобы иметь возможность их искать. Например, вы можете искать слово ERROR в своих журналах, поэтому вы, вероятно, хотели бы видеть в результатах сообщения типа «Была ошибка в вашем кластере» или «Ошибка обработка независимо». Если вы не проанализируете данные для этого поля с tokenizers, вы не сможете выполнить поиск следующим образом.

Это проанализировано поведение полезно, когда вы хотите искать вещи, но не позволяет группировать, когда разные сообщения имеют одинаковый контент. Это ваше дело. Решением этого является обновление вашего сопоставления, введя not_analyzed для этого конкретного поля, которое вы не хотите разделять на токены. Это, вероятно, будет работать для вашего поля host, но, скорее всего, он сломает поиск.

Что я обычно делаю для таких ситуаций, это использовать index templates и multifields. Шаблон индекса позволяет мне устанавливать сопоставление для каждого индекса, соответствующего регулярному выражению, и многоуровневые поля позволяют мне иметь поведение analyzed и not_analyzed в одном и том же поле.

Используя следующий запрос будет сделать работу вашей проблемы:

curl -XPUT https://example.org/_template/name_of_index_template -d ' 
{ 
    "template": "indexname*", 
    "mappings": { 
     "type": { 
      "properties": { 
       "field_name": { 
        "type": "multi_field", 
        "fields": { 
        "field_name": { 
         "type": "string", 
         "index": "analyzed" 
        }, 
        "untouched": { 
         "type": "string", 
         "index": "not_analyzed" 
        }      
       } 
      } 
     } 
    } 
}' 

, а затем в панели терминов вы можете использовать field.untouched, чтобы рассмотреть все содержимое поля при вычислении подсчета различных элементы.

Если вы не хотите использовать шаблоны индексов (возможно, ваши данные указаны в одном индексе), настройка отображения с помощью Put Mapping API также будет выполнять задание. И если вы используете multifields, нет необходимости переиндексировать данные, потому что с момента установки нового отображения для индекса новые данные будут дублироваться в этих двух подполях (field_name и field_name.untouched). Если вы просто измените отображение с analyzed на not_analyzed, вы не сможете увидеть никаких изменений, пока не перевернете все свои данные.

+0

Нужно ли передавать точное имя поля вместо «field_name», или просто это будет работать для всех полей? – brunodahora

+0

@brunodahora Вы должны указать имя поля. – Pigueiras

Смежные вопросы