2014-10-15 2 views
0

Я все еще довольно новичок в logstash, анализируя многострочное сообщение журнала, все еще кажущееся немного пугающим, но я надеюсь, что для того, что я пытаюсь сделать (ака, разобрать журналы logstash), это довольно пробованные и проверенные шаблоны и надеясь, что кто-то сможет указать мне на рабочее решение.Рецепт Grok multiline?

В принципе у меня есть ошибка, как это:

[2014-10-15 22:34:36,958][DEBUG][action.search.type  ] [kafka] [logstash-2014.10.15][1], node[RBRz8xNgQQKsAnEgbjqVTw], [P], s[STARTED]: Failed to execute [[email protected]] lastShard [true] 
org.elasticsearch.search.SearchParseException: [logstash-2014.10.15][1]: from[-1],size[-1]: Parse Failure [Failed to parse source [{"facets":{"stats":{"statistical":{"field":"host"},"facet_filter":{"fquery":{"query":{"filtered":{"query":{"bool":{"should":[{"query_string":{"query":"status:200"}},{"query_string":{"query":"status:304"}},{"query_string":{"query":"_missing_:status"}},{"query_string":{"query":"type:\"nginx-error\""}},{"query_string":{"query":"type:(-\"nginx-*\")"}},{"query_string":{"query":"status:[308 TO 999]"}}]}},"filter":{"bool":{"must":[{"range":{"@timestamp":{"from":1413411577151,"to":1413412477151}}}]}}}}}}},"stats_Success":{"statistical":{"field":"host"},"facet_filter":{"fquery":{"query":{"filtered":{"query":{"bool":{"should":[{"query_string":{"query":"status:200"}}]}},"filter":{"bool":{"must":[{"range":{"@timestamp":{"from":1413411577151,"to":1413412477151}}}]}}}}}}},"stats_Cache Hits":{"statistical":{"field":"host"},"facet_filter":{"fquery":{"query":{"filtered":{"query":{"bool":{"should":[{"query_string":{"query":"status:304"}}]}},"filter":{"bool":{"must":[{"range":{"@timestamp":{"from":1413411577151,"to":1413412477151}}}]}}}}}}},"stats_No Status":{"statistical":{"field":"host"},"facet_filter":{"fquery":{"query":{"filtered":{"query":{"bool":{"should":[{"query_string":{"query":"_missing_:status"}}]}},"filter":{"bool":{"must":[{"range":{"@timestamp":{"from":1413411577152,"to":1413412477152}}}]}}}}}}},"stats_NGINX error":{"statistical":{"field":"host"},"facet_filter":{"fquery":{"query":{"filtered":{"query":{"bool":{"should":[{"query_string":{"query":"type:\"nginx-error\""}}]}},"filter":{"bool":{"must":[{"range":{"@timestamp":{"from":1413411577152,"to":1413412477152}}}]}}}}}}},"stats_Not Nginx":{"statistical":{"field":"host"},"facet_filter":{"fquery":{"query":{"filtered":{"query":{"bool":{"should":[{"query_string":{"query":"type:(-\"nginx-*\")"}}]}},"filter":{"bool":{"must":[{"range":{"@timestamp":{"from":1413411577152,"to":1413412477152}}}]}}}}}}},"stats_Failure":{"statistical":{"field":"host"},"facet_filter":{"fquery":{"query":{"filtered":{"query":{"bool":{"should":[{"query_string":{"query":"status:[308 TO 999]"}}]}},"filter":{"bool":{"must":[{"range":{"@timestamp":{"from":1413411577152,"to":1413412477152}}}]}}}}}}}},"size":0}]] 
    at org.elasticsearch.search.SearchService.parseSource(SearchService.java:660) 
    at org.elasticsearch.search.SearchService.createContext(SearchService.java:516) 
    at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:488) 
    at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:257) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:206) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:203) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$23.run(SearchServiceTransportAction.java:517) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.elasticsearch.search.facet.FacetPhaseExecutionException: Facet [stats]: field [host] isn't a number field, but a string 
    at org.elasticsearch.search.facet.statistical.StatisticalFacetParser.parse(StatisticalFacetParser.java:132) 
    at org.elasticsearch.search.facet.FacetParseElement.parse(FacetParseElement.java:93) 
    at org.elasticsearch.search.SearchService.parseSource(SearchService.java:644) 
    ... 9 more 

который, кажется, упираясь в моем использовании «хозяина» в приборной панели Kibana как числовой. На самом деле я не заинтересован в фактической ошибке и больше заинтересован в том, чтобы анализировать это в эффективном режиме logstash, чтобы я мог посмотреть в Kibana и увидеть разумное сообщение об ошибке.

Я предполагаю, что это потребует использования кодека multiline { ... } для ввода моего файла, но, глядя на это сообщение, оно выглядит довольно волосатым ... конечно, есть пословичное «колесо», где-то, где я не нужно изобретать?

ответ

1

multiline {...} - это путь. Попробуйте фрагмент ниже в file тип input.

codec => multiline 
{ 
    pattern => "(^\d+\serror)|(^.+Exception: .+)|(^\s+at .+)|(^\?s+... \d+ more)|(^\s*Caused by:.+)|(^.+ \d+ common frames omitted) 
    what => "previous" 
    multiline_tag => "multi_tagged" 
} 
1

Каждое исключение начинается с даты, поэтому ключ от нее. Вот пример «фильтра», но он подходит для кодека:

+0

Каковы преимущества/недостатки фильтра или кодека? – ken

+1

Кодек является предпочтительным способом, так как тогда сообщение будет завершено до начала строфы фильтра. Я предполагаю, что в конце концов они будут обесценивать фильтр. Я опубликовал пример фильтра, потому что мне было удобно, и образец выглядел более чистым, чем другие. –