2015-02-05 6 views
1

Я пытаюсь разобрать файл журнала с grok. используемая конфигурация позволяет мне разобрать одно выровненное событие, но не многострочное (с трассировкой java-стека).logstash multiline codec with java stack trace

#what i get on KIBANA for a single line: 
 
{ 
 
    "_index": "logstash-2015.02.05", 
 
    "_type": "logs", 
 
    "_id": "mluzA57TnCpH-XBRbeg", 
 
    "_score": null, 
 
    "_source": { 
 
    "message": " - 2014-01-14 11:09:35,962 [main] INFO (api.batch.ThreadPoolWorker) user.country=US", 
 
    "@version": "1", 
 
    "@timestamp": "2015-02-05T09:38:21.310Z", 
 
    "path": "/root/test2.log", 
 
    "time": "2014-01-14 11:09:35,962", 
 
    "main": "main", 
 
    "loglevel": "INFO", 
 
    "class": "api.batch.ThreadPoolWorker", 
 
    "mydata": " user.country=US" 
 
    }, 
 
    "sort": [ 
 
    1423129101310, 
 
    1423129101310 
 
    ] 
 
} 
 

 
#what i get for a multiline with Stack trace: 
 
    { 
 
    "_index": "logstash-2015.02.05", 
 
    "_type": "logs", 
 
    "_id": "9G6LsSO-aSpsas_jOw", 
 
    "_score": null, 
 
    "_source": { 
 
    "message": "\tat oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:20)", 
 
    "@version": "1", 
 
    "@timestamp": "2015-02-05T09:38:21.380Z", 
 
    "path": "/root/test2.log", 
 
    "tags": [ 
 
     "_grokparsefailure" 
 
    ] 
 
    }, 
 
    "sort": [ 
 
    1423129101380, 
 
    1423129101380 
 
    ] 
 
}
input { 
 
    file { 
 
    path => "/root/test2.log" 
 
    start_position => "beginning" 
 
    codec => multiline { 
 
     pattern => "^ - %{TIMESTAMP_ISO8601} " 
 
     negate => true 
 
     what => "previous" 
 
    } 
 
    } 
 
} 
 

 
filter { 
 
grok { 
 
    match => [ "message", " -%{SPACE}%{SPACE}%{TIMESTAMP_ISO8601:time} \[%{WORD:main}\] %{LOGLEVEL:loglevel}%{SPACE}%{SPACE}\(%{JAVACLASS:class}\) %{GREEDYDATA:mydata} %{JAVASTACKTRACEPART}"] 
 
    } 
 
    date { 
 
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] 
 
    } 
 
} 
 

 
output { 
 
    elasticsearch { 
 
    host => "194.3.227.23" 
 
    } 
 
# stdout { codec => rubydebug} 
 
}

Может кто-нибудь пожалуйста, скажите мне, что я делаю неправильно в моем файле конфигурации? Благодарю. вот пример моего файла журнала: - 2014-01-14 11: 09: 36,447 [main] INFO (support.context.ContextFactory) Создание контекста по умолчанию - 2014-01-14 11: 09: 38,623 [main] ERROR (support.context.ContextFactory) Ошибка при подключении к базе данных jdbc: oracle: thin: @ HAL9000: 1521: DEVPRINT, с пользователем cisuser и драйвером oracle.jdbc.driver.OracleDriver java.sql.SQLException: ORA-28001: Срок действия пароля истек на oracle.jdbc.driver.SQLStateMapping.newSQLException (SQLStateMapping.java:70) в oracle.jdbc.driver.DatabaseError.newSQLException (DatabaseError.java:131) **

*> EDIT: вот последняя конфигурация, которую я использую

https://gist.github.com/anonymous/9afe80ad604f9a3d3c00#file-output-L1 *

**

+0

Вы не страдает от проблемы grok, но многострочной проблемы. Обратите внимание, что ваше второе событие должно быть объединено с первым событием. Тем не менее, причина не выпрыгивает на меня. –

+0

Я знаю, что это многострочный вопрос, который я не знаю, как решить, я попробовал много моделей вместе с ним. но я не получаю результат, я ожидаю, что все строки журнала объединены вместе в одном событии или многострочном parsefailure. Мне нужно совместить событие со своим стеклом. – sally

+0

Можете ли вы изменить формат журнала/добавить улучшенный формат журналов? Если да, вы можете переключиться на JSON или использовать онлайн-приложения, такие как GELF или log4j/SocketAppender. – mp911de

ответ

4

Первая точка, повторяя тестирование с входом файла, обязательно используйте sincedb_path => "/ DEV/нуль" быть уверены, чтобы прочитать от начала файла.

О многострочный, должно быть что-то не так с вашим контентом вопрос или ваш шаблон многострочного, так как ни один из события не имеют многострочный тег, добавленный многострочного кодек или фильтр при объединении строк. Ваше сообщение должно содержать все строки, разделенные символами строки \ n (\ r \ n в моем случае на окнах). Вот ожидаемый выход из конфигурации входного

{ 
"@timestamp" => "2015-02-10T11:03:33.298Z", 
    "message" => " - 2014-01-14 11:09:35,962 [main] INFO (api.batch.ThreadPoolWorker) user.country=US\r\n\tat oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:20\r", 
    "@version" => "1", 
     "tags" => [ 
    [0] "multiline" 
], 
     "host" => "localhost", 
     "path" => "/root/test.file" 
} 

О Grok, как вы хотите, чтобы соответствовать многострочным строкам, вы должны использовать шаблон, как это.

filter { 
    grok { 
    match => {"message" => [ 
     "(?m)^ -%{SPACE}%{TIMESTAMP_ISO8601:time} \[%{WORD:main}\] % {LOGLEVEL:loglevel}%{SPACE}\(%{JAVACLASS:class}\) %{DATA:mydata}\n%{GREEDYDATA:stack}", 
     "^ -%{SPACE}%{TIMESTAMP_ISO8601:time} \[%{WORD:main}\] %{LOGLEVEL:loglevel}%{SPACE}\(%{JAVACLASS:class}\) %{GREEDYDATA:mydata}"] 
} 

}}

(? М) префикса инструктировать регулярки двигателя, чтобы сделать многострочное согласование. И тогда вы получите событие как

{ 
"@timestamp" => "2015-02-10T10:47:20.078Z", 
    "message" => " - 2014-01-14 11:09:35,962 [main] INFO (api.batch.ThreadPoolWorker) user.country=US\r\n\tat oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:20\r", 
    "@version" => "1", 
     "tags" => [ 
    [0] "multiline" 
], 
     "host" => "localhost", 
     "path" => "/root/test.file", 
     "time" => "2014-01-14 11:09:35,962", 
     "main" => "main", 
    "loglevel" => "INFO", 
    "class" => "api.batch.ThreadPoolWorker", 
    "mydata" => " user.country=US\r", 
    "stack" => "\tat oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:20\r" 
} 

Вы можете построить и проверить свои шаблоны многострочные с этим интернет-инструментом http://grokconstructor.appspot.com/do/match

последнее предупреждение, в настоящее время существует ошибка в Logstash ввод файла с многострочным кодека Mixup содержимое из нескольких файлов, если вы используете список или шаблон в настройках пути.Только workaroud является использование многострочного ФИЛЬТР ДЛЯ

НТН

EDIT: Я сосредотачивался на многострочных строк, вам нужно добавить подобный шаблон для не отдельных линий строки

+0

Благодарим вас за отзыв Philippe. Вот результат, когда я использую ваш шаблон: {"message" => "2014-10-14 10: 11: 35,962 [main] INFO (api.batch.ThreadPoolWorkFactory) некоторый текст здесь", "@version" => "1", "@timestamp" => "2015-02-10T12: 26: 11.179Z", "path" => "/root/trace.log", "tags" => [[0] " _grokparsefailure "]} {" message "=>" \ tat track здесь ", " @version "=>" 1 ", " @timestamp "=>" 2015-02-10T12: 26: 11.179Z " , "путь" => "/root/trace.log", "метка" => [[0] "_grokparsefailure"]} – sally

+0

я использовал фильтр многострочный: фильтр { многострочного { типа => «многострочной " рисунок => "^ \ тат" , что => "предыдущий" } Grok {(? М) матч => [ "сообщение",»^ -% {пробел}% {пробел}% {TIMESTAMP_ISO8601: время} \ [% {WORD: main} \]% {LOGLEVEL: loglevel}% {SPACE}% {SPACE} \ (% {JAVACLASS: class} \)% {DATA: mydata} \ n% {GREEDYDATA: stack} "]} дата { матч => [ "временная метка", "дд/МММ/год: HH: мм: сс Z"] }} – sally

+0

Я все еще получаю ту же ошибку с новым рисунком. каждая строка разделяется как одно событие с grok_parsefailure. – sally