У меня есть журналы, которые я использую с помощью Fluentd и отправляю в Elasticsearch. Я хотел бы создать новое поле, если будет найдена строка.
Образец журнала:
{
"@timestamp": "2021-01-29T08:05:38.613Z",
"@version": "1",
"message": "Started Application in 110.374 seconds (JVM running for 113.187)",
"level": "INFO"
}
Я хочу создать новое поле НАЧАЛО ВРЕМЕНИ, и в этом случае значение будет 113.187.
Я пробовал использовать разделение record_transformer и ruby для получения значения, но кажется, что когда оно совпадает с ним, удаляет строку, которую я хочу, из файла журнала.
<filter**>
@type record_transformer
enable_ruby true
<record>
STARTIME ${record["message"].split("JVM running").last.split(")")}
</record>
</filter>
Как я могу создать это новое поле с желаемым значением?
Я использовал предложенный ниже вариант:
<filter**>
@type record_transformer
enable_ruby true
<record>
STARTIME ${record["message"].split("JVM running for ").last.split(")")[0]}
</record>
</filter>
Это приблизило меня. Что происходит сейчас, так это то, что создается поле STARTIME, и когда запись в журнале совпадает, оно имеет значение 113.187, что является правильным, однако каждая другая строка, которая не соответствует этому шаблону, просто добавляется в новое поле.
STARTIME ${record["message"].split("JVM running for ").last.split(")")[0]}
, а вывод через stdout -2021-01-30 18:45:05.885183400 +0500 test: {"@timestamp":"2021-01-29T08:05:38.613Z","@version":"1","message":"Started Application in 110.374 seconds (JVM running for 113.187)","level":"INFO","STARTIME":"113.187"}
. - person Azeem   schedule 30.01.2021STARTIME
сnull
, если фактическое значение не найдено? - person Azeem   schedule 01.02.2021STARTIME ${ s = record['message'][/JVM running for \d{3}.\d{3}/]; s ? s.split(' ')[-1] : nil }
- person Azeem   schedule 01.02.2021STARTIME
будет иметь допустимое значение, в противном случаеnull
. Так что поступайте соответственно с другой стороны. - person Azeem   schedule 01.02.2021