# Logstash: Как заменить значение полей на основании содержимого

**URL:** <https://discuss.elastic.co/t/logstash/200204>\
**Category:** Вопросы на русском языке\
**Created:** [September 19, 2019, 1:08pm UTC](https://discuss.elastic.co/t/logstash/200204 "2019-09-19T13:08:51Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Igor\_Belyakov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_belyakov/32/52615_2.png) [@Igor\_Belyakov](https://discuss.elastic.co/u/Igor_Belyakov)\
**Post date:** [September 19, 2019, 1:08pm UTC](https://discuss.elastic.co/t/logstash/200204/1 "2019-09-19T13:08:51Z")

</div>

Добрый день.  
Столкнулся с такой проблемой. У меня в логах вместо источников событий указываются индексы этих источников. Так как перечень источников конечен, то нет большой проблемы составить таблицу сопоставлений индексов и названий источников:

* * *

Индекс, Название  
1, source\_name\_1  
2, source\_name\_2

* * *

Сейчас вижу два пути решения этой задачи:

1. filter -\> if (значение равно индексу) -\> mutate -\> replace
2. filter -\> alter -\> condrewrite

**Первый вариант** работает, но использование данной конструкции занимает слишком много места в конфиге и при этом сложночитаемо:  
filter {  
if [source] == "1" {  
mutate { replace =\> ["source", "source\_name\_1"] }  
}  
if [source] == "2" {  
mutate { replace =\> ["source", "source\_name\_2"] }  
}  
}

Получается много строк и много ифов.

**Второй вариант** намного лаконичнее, по, почему-то не работает(((  
filter {  
alter {  
condrewrite =\> [  
"[source]", "1", "source\_name\_1",  
"[source]", "2", "source\_name\_2"  
]  
}  
}  
Такой вариант тоже не работает:  
filter {  
alter {  
condrewrite =\> ["[source]", "1", "source\_name\_1" ]  
condrewrite =\> ["[source]", "2", "source\_name\_2" ]  
}  
}

Прошу подсказать, правильно ли использовать фильтр alter для решения подобной задачи, или я совсем не тем занимаюсь и существует другое, правильное решение

---

<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:** [September 19, 2019, 2:54pm UTC](https://discuss.elastic.co/t/logstash/200204/2 "2019-09-19T14:54:48Z")

</div>

A `"source", "1", "source_name_1",....` (без `[` `]` ) не пробовали?

---

<div class="post-metadata">

**Author:** ![Igor\_Belyakov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_belyakov/32/52615_2.png) [@Igor\_Belyakov](https://discuss.elastic.co/u/Igor_Belyakov)\
**Post date:** [September 20, 2019, 8:32am UTC](https://discuss.elastic.co/t/logstash/200204/3 "2019-09-20T08:32:53Z")

</div>

Попробовал. Логсташ выдает ошибку и отказывается запускаться

---

<div class="post-metadata">

**Author:** ![Igor\_Belyakov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_belyakov/32/52615_2.png) [@Igor\_Belyakov](https://discuss.elastic.co/u/Igor_Belyakov)\
**Post date:** [September 20, 2019, 11:56am UTC](https://discuss.elastic.co/t/logstash/200204/4 "2019-09-20T11:56:55Z")

</div>

Проблема решена.  
Вот такой вариант работает корректно:  
filter {  
alter {  
condrewrite =\> ["[source]", "1", "source\_name\_1" ]  
condrewrite =\> ["[source]", "2", "source\_name\_2" ]  
}  
}

Ошибка возникла из-за неправильных исходных данных. Амазон некорректно формирует json:  
 ![image](https://us1.discourse-cdn.com/elastic/original/3X/d/d/ddd191f3e585a046990bd08d3ea6ed1e938e5b5f.png)

А элемент массива нельзя подать на вход фильтру alter.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [October 18, 2019, 11:57am UTC](https://discuss.elastic.co/t/logstash/200204/5 "2019-10-18T11:57:35Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
