У меня настроена связка ELK. Приложение отдает лог через http в json формате. В моем случае это play framework.
В logstash настроен http_pooler для чтения лога.
input {
http_poller {
urls => {
finac => {
method => get
url => "http://192.168.1.100:9010/health/status"
headers => {
Accept => "application/json"
}
}
}
request_timeout => 20
interval => 60
tags => ["finac"]
type => "app"
codec => "json"
metadata_target => "http_poller_metadata"
}
}
filter {
if "finac" in [tags] {
json {
source => "message"
}
}
}
output {
if "finac" in [tags] {
elasticsearch {
codec => "json"
hosts => "localhost:9200"
index => "debug-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
}
Но при попытке записи в Elasticsearch получаю ошибку
{:timestamp=>"2017-02-09T16:07:20.880000+0300", :message=>"Failed action. ", :status=>400, :action=>["index", {:_id=>nil,
..........
{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"mapper [play.CorePlugin.monitors.max] of different type, current_type [double], merged_type [long]"}}}}, :level=>:warn}
Я так понял он не может его распарсить правильно и ругается. В инете советуют писать шаблон для json.
Например такой:
{
"template": "userkeyword*",
"order": 1,
"mappings": {
"logs": {
"dynamic_templates": [{
"string_template": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
}],
"properties": {
"keyword": {
"type": "string",
"analyzer": "keyword_analyzer",
"fields": {
"autocomplete": {
"type": "string",
"search_analyzer": "autocomplete_search_analyzer",
"analyzer": "autocomplete_index_analyzer"
},
"readingform": {
"type": "string",
"search_analyzer": "readingform_search_analyzer",
"analyzer": "readingform_index_analyzer"
}
}
}
}
}
}
}
У приложения логи которого я хочу загнать в elasticsearch json log содержит порядка 2000 компонентов.
Существуют ли какие нибудь автоматизированные системы для конвертирования сформированного json лога в template?