# Logstash и JSON

**URL:** <https://discuss.elastic.co/t/logstash-json/75314>\
**Category:** Вопросы на русском языке\
**Created:** [February 16, 2017, 10:47am UTC](https://discuss.elastic.co/t/logstash-json/75314 "2017-02-16T10:47:18Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [February 16, 2017, 10:47am UTC](https://discuss.elastic.co/t/logstash-json/75314/1 "2017-02-16T10:47:18Z")

</div>

У нас все логи веб-приложений пишутся в JSON, при этом "кто в лес кто по дрова". Собирается все на центральный сервер syslog-ng который переодически перестает работать из-за лимита json ключей 65к. Пытаюсь скормить такой JSON в ELK. Затыкается((((

Каждый логи JSON большой:  
`{"PROGRAM":"test","context":{"route":"privilege_get_token","_id":"2939","project_id":"[null]","user":"2939","user_role":"ROLE_OWNER","http_status_code":"200","plain_request":"POST /test/test/2939/token HTTP/1.1\r\nAccept: application/json\r\nAccept-Encoding: gzip,deflate,br\r\nAuthorization: Basic 9384hf9dsh4387hq0J==\r\nConnection: close\r\nContent-Length: 187\r\nContent-Type: application/json\r\nHost: api.test.com\r\nHttps: on\r\nPhp-Auth-Pw: 98h34f-sdfh\r\nPhp-Auth-User: 2939\r\nUser-Agent: AppEngine-Google; (+http://code.google.com/appengine; appid: s~realmoemadd)\r\nX-Cloud-Trace-Context: d585aa33f31342534f3457379d5f/125734ref3ef3d410406\r\nX-Forwarded-For: 107.10.33.79\r\nX-Forwarded-Port: 443\r\nX-Forwarded-Proto: https\r\nX-Php-Ob-Level: 2\r\nX-Real-Ip: 107.10.33.79\r\n\r\n{\"user\": {\"id\": {\"hidden\": true, \"value\": \"stworks:76584\"}, \"email\": {\"value\": \"stworks: 76584\"}}, \"settings\": {\"project_id\": 20, \"ui\": {\"theme\": \"dark\"}}}"},"level_name":"INFO","datetime":"2017-02-15 23:59:59","extra":{"uid":"1b7","http":{"SERVER":{"HTTP_HOST":"api.test.com","HTTP_X_REAL_IP":"107.10.33.79","REMOTE_ADDR":"107.10.33.79","CONTENT_TYPE":"application/json","REQUEST_URI":"/test/test/2939/token","QUERY_STRING":""},"PHP_INPUT":{"user":{"id":{"hidden":"[true]","value":"stworks:76592484"},"email":{"value":"stworks:76561184"}},"settings":{"project_id":"20","ui":{"theme":"dark"}}}}},"MESSAGE":"API response","LEVEL_NUM":"6","HOST":"api.local","UNIXTIME":1487192399,"SOURCEIP":"172.16.16.12","ISODATE":"2017-02-15T23:59:59+03:00"}`

Конфиг для logstash пытался делать такой:

```
input {
        file {
                type => "json"
                path => ["api.local.txt"]
                start_position => "beginning"
        }
}

filter {
if [type] == "json" {
        json {
                source => "message"
                add_tag => ["tokens"]
        }
}
}

output {
if [type] == "json" {
        elasticsearch {
                hosts => ["localhost:9200"]
                sniffing => false
                manage_template => false
                index => "token-%{+ddMMYYYY}-%{type}"
                document_type => "%{type}"
        }
}
}

```

Подскажите что нужно еще использоваться чтобы оптимизировано парсить такие json?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 16, 2017, 11:45am UTC](https://discuss.elastic.co/t/logstash-json/75314/2 "2017-02-16T11:45:25Z")

</div>

А кто затыкается? Logstash или elasticsearch? И как? Какой меппинг у поля `plain_request`?

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [February 16, 2017, 12:09pm UTC](https://discuss.elastic.co/t/logstash-json/75314/3 "2017-02-16T12:09:50Z")

</div>

лог с json весил 900мб, elastic сделал индекс на полтора гига, кибана зависала когда я пробовал в паттерны зайти, или в discovery выбрать этот индекс. Попробовал сделать файл со 100 такими json и скормил его, 388 fields из 100 json...

маппингов никаких не делал...

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 16, 2017, 12:21pm UTC](https://discuss.elastic.co/t/logstash-json/75314/4 "2017-02-16T12:21:44Z")

</div>

> [@cwt](#):
>
> лог с json весил 900мб, elastic сделал индекс на полтора гига,

Это, в общем-то, нормально.

> [@cwt](#):
>
> кибана зависала когда я пробовал в паттерны зайти, или в discovery выбрать этот индекс.

А вот это не хорошо. Сколько полей у вас в этом случае было?

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [February 16, 2017, 12:39pm UTC](https://discuss.elastic.co/t/logstash-json/75314/5 "2017-02-16T12:39:22Z")

</div>

не могу сказать, если со 100 строк 388 ключей было... то думаю оочень много. при этом ключ в паттернах дублировались только добавлялось .keyword

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 16, 2017, 12:53pm UTC](https://discuss.elastic.co/t/logstash-json/75314/6 "2017-02-16T12:53:47Z")

</div>

Да, слишком большое количество полей представляет серьезную проблему. В elasticsearch 5.0 и выше мы даже добавили специальную проверку, которая не позволяет создавать типы с 1000 полей или больше с установками по умолчанию.

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [February 16, 2017, 2:18pm UTC](https://discuss.elastic.co/t/logstash-json/75314/7 "2017-02-16T14:18:39Z")

</div>

а можно как-то сделать чтобы создались 500 первые, а потом как plain text все были?  
или указать поля которые постоянно есть в логах, а остальные как plain text?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 16, 2017, 2:29pm UTC](https://discuss.elastic.co/t/logstash-json/75314/8 "2017-02-16T14:29:35Z")

</div>

Можно выбрать эти 500 полей и создать меппинг вручную и потом выключить [dynamic mapping](https://www.elastic.co/guide/en/elasticsearch/reference/5.2/dynamic.html).

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [February 16, 2017, 3:05pm UTC](https://discuss.elastic.co/t/logstash-json/75314/9 "2017-02-16T15:05:36Z")

</div>

Igor\_Motov, спасибо большое, попробую завтра разобраться с маппингом...

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [February 20, 2017, 7:13am UTC](https://discuss.elastic.co/t/logstash-json/75314/10 "2017-02-20T07:13:46Z")

</div>

Добрый день, а можно ли задать например чтобы fields создавались только для верхнего уровня, для nested 3 и ниже уже не делались. Я пробовал:

> "index.mapping.total\_fields.limit": 1000,  
> "index.mapping.depth.limit": 3,  
> "index.mapping.nested\_fields.limit": 100

Но в этом случае он ругается что есть элементы ниже и вообще документы не добавляет в индекс:

> java.lang.IllegalArgumentException: Limit of mapping depth [4] in index [token-20022017] has been exceeded due to object field [extra.http.PHP\_INPUT.user]

Как сделать так чтобы обрабатывались только ключи выше?

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [February 20, 2017, 8:28am UTC](https://discuss.elastic.co/t/logstash-json/75314/11 "2017-02-20T08:28:28Z")

</div>

```
"properties" : {
      "extra" : {
        "dynamic" : false,
        "type" : "nested"
      }
    }

```

Решил пока так...

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [February 20, 2017, 1:24pm UTC](https://discuss.elastic.co/t/logstash-json/75314/12 "2017-02-20T13:24:39Z")

</div>

Я думаю, лучше сделать так:

```auto
 "properties" : {
      "extra" : {
        "type" : "object",
        "enabled" : false
      }
    }

```

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [March 1, 2017, 4:20am UTC](https://discuss.elastic.co/t/logstash-json/75314/13 "2017-03-01T04:20:01Z")

</div>

А как все же сделать чтобы index pattern создавался и доставал все fields?  
Я направил боевой трафик логов-json (за сутки инедкс 15г), они складываются в индекс с rate ~70 сообщений в секунду. По нагрузке все ок. Но как только я через kibana захожу в Index Pattern и пытаюсь создать кибана долго думает и вылетает по таймауту. Я пробовал увеличить до 2х минут этот таймаут - не помогает((

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 1, 2017, 5:06am UTC](https://discuss.elastic.co/t/logstash-json/75314/14 "2017-03-01T05:06:37Z")

</div>

А сколько индексов и полей в каждом индексе у вас сейчас в кластере?

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [March 1, 2017, 5:27am UTC](https://discuss.elastic.co/t/logstash-json/75314/15 "2017-03-01T05:27:10Z")

</div>

Индекс посуточный. Вчера запустил - соответственно два индекса, в одном 1m доков во втором 624к.  
Вот что случается после запуска создания index pattern в кибана:  
 ![](https://us1.discourse-cdn.com/elastic/original/2X/a/a1832587a29fb1d507e194a9f0670e76d3d5fa56.png)

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [March 1, 2017, 8:36am UTC](https://discuss.elastic.co/t/logstash-json/75314/16 "2017-03-01T08:36:04Z")

</div>

На самом деле на вид все отлично если воспользоваться вашим советом и выключить context. Он даже все fields внутри context показывает в discovery но со статусом "No cache mapping for this fields" , но все летает

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 1, 2017, 9:46pm UTC](https://discuss.elastic.co/t/logstash-json/75314/17 "2017-03-01T21:46:43Z")

</div>

Это я понял. Я хочу сообщить команде, которая занимается проектом Kibana, об этой проблеме, но первое что они спросят это как воспроизвести эту проблему, и для этого нам нужно знать сколько полей (не документов) в каждом из этих индексов. То есть если вы запустите `curl localhost:9200/ИМЯ_ИНДЕКСА/_mappings` сколько типов и сколько элементов в `properties` в каждом типе вы получите.

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [March 2, 2017, 4:31am UTC](https://discuss.elastic.co/t/logstash-json/75314/18 "2017-03-02T04:31:41Z")

</div>

Игорь, спасибо за помощь и советы(я на самом деле активно пытался читать документацию но она с виду супер но когда читаешь вообще ничего не понятно). Я не знал что это поля называется, я так понимаю это соответствует количеству fileds в index pattern? Если да то я полагаю - десятки тысяч. Проверить не могу потому что умирает не кибана а эластик. Но: я пробовал удалить все индексы, паттерны и включить на минуту логи и затем выключить logstash, у меня за минуту кибана смогла отобразить почти 3к fields. Сейчас я выключил пару ключей json по вашему совету и у меня все работает, я отдал на тестирование. Только я не понял одного - если enabled: false выключает парсинг и индексирование этих ключей, то почему он все равно все эти ключи показывает в discovery(с восклицательным знаком) и ищет по ним?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [March 2, 2017, 4:12pm UTC](https://discuss.elastic.co/t/logstash-json/75314/19 "2017-03-02T16:12:15Z")

</div>

А какая версия elasticsearch и kibana?

---

<div class="post-metadata">

**Author:** ![cwt](https://avatars.discourse-cdn.com/v4/letter/c/e47774/32.png) [@cwt](https://discuss.elastic.co/u/cwt)\
**Post date:** [March 2, 2017, 4:39pm UTC](https://discuss.elastic.co/t/logstash-json/75314/20 "2017-03-02T16:39:29Z")

</div>

5.2, весь стэк последние вроде как

[Next page](https://discuss.elastic.co/t/logstash-json/75314.md?page=2)
