Как распарсить лог нжинкса в случае хождения по апстримам


(Victor Zhuravlyov) #1

Помогите с идеями как лучше распарсить лог нжинкса в случае хождения по апстримам

Прилетать может в подобных вариациях:
В зависимости от количества апстримов и с разделителями ", " или " : "
Формат аля csv в данном случае не принципиален, принципиально понять суть как лучше.
Моя идея в том чтобы ловить последний апстрим как upstream (айпи, статус и время коннект респонс), а всё что до последнего апстрима запихивать в badupstream просто текстом.
Может у кого-то был опыт?
В идеале, конечно, если бы nginx отправлял в таких случаях отдельными полями, тогда бы не было вопросов - включил json и всё, а так приходится выкручиваться ибо не люблю _grokparsefailure

Вот примерные вариации логов ("upstream_addr"; "upstream_status"; "upstream_connect_time"; "upstream_response_time")

"-"; "-"; "- sec"; "- sec";
"-, -"; "-, -"; "-, - sec"; "-, - sec";
"- : -"; "- : -"; "- : - sec"; "- : - sec";
"-, - : -"; "-, - : -"; "-, - : - sec"; "- : - sec";
"10.10.10.23:80"; "200"; "2.953 sec"; "2.953 sec";
"10.10.10.23:80, 10.10.10.24:80"; "502, -"; "2.953, - sec"; "2.953, - sec";
"10.10.10.23:80 : 10.10.10.24:80"; "502 : -"; "2.953 : - sec"; "2.953 : - sec";
"10.10.10.23:80, 10.10.10.24:80 : 10.10.10.25:80"; "502, 502 : -"; "2.953, 1.000 : - sec"; "2.953, 2.000 : - sec";
"10.10.10.23:80, 10.10.10.24:80 : 10.10.10.25:80"; "502, 502 : 200"; "2.953, 1.000 : 0.001 sec"; "2.953, 2.000 : 0.002 sec";
"10.10.10.23:80, 10.10.10.24:80, 10.10.10.25:80"; "502, 502, -"; "2.953, 1.000, - sec"; "2.953, 2.000, - sec";
"10.10.10.23:80, 10.10.10.24:80, 10.10.10.25:80"; "502, 502, 200"; "2.953, 1.000, 0.001 sec"; "2.953, 2.000, 0.002 sec";


(Vladimir Dolzhenko) #2

может лучше воспользоваться CSV фильтром ?


(Victor Zhuravlyov) #3

А как это решит проблему с апстримами?
Формат не принципиален, к сожалению - в данном случае он похож на csv но проблема не с полями, как таковыми, а с множественными значениями внутри некоторых полей - вот их и хочу ловить правильно.
Сейчас у меня работает вариант который выкусывает последнее как upstream* и всё что до как badupstream - а чем csv фильтр мне поможет?


(Victor Zhuravlyov) #4

Я нашел решение (gsub + split + ruby)
Если есть поля с множественными значениями, то из них создаются доп. поля.
Потестирую и выложу сюда, если всё устроит.


(system) #5

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