2016-01-05 2 views
1

Я пытаюсь объяснить лучше: У меня этот многострочный журнал. Ниже я показываю файл с 3-х бревен, она начинается с «INFO» и закончить «</диалог>»:Анализ многострочных журналов: строка + xml

INFO 05-01-16 08:06:01 [http-nio-8080-exec-8] (AbstractServer.java:454) - 
<dialogue> 
    <server>FirstLog</server> 
    <duration>311</duration> 
[...] 
</dialogue> 
INFO 05-01-16 08:06:02 [http-nio-8080-exec-8] (AbstractServer.java:454) - 
<dialogue> 
    <server>SecondLog</server> 
    <duration>500</duration> 
     [...] 
</dialogue> 
INFO 05-01-16 08:06:03 [http-nio-8080-exec-8] (AbstractServer.java:454) - 
<dialogue> 
    <server>ThirdLog</server> 
    <duration>100</duration> 
     [...] 
</dialogue> 

Я использую этот фильтр:

if [type] == "oldLogs" { 
       multiline { 
        pattern => "^%{LOGLEVEL}" 
        what => "previous" 
        negate => "true" 
       }  
       grok { 
        patterns_dir => "./patterns" 
        match => ["message", "(?m)%{LOGLEVEL:level} %{TIMESTAMP_ISO8601:timestamp} \[%{PROG:msg_1}\] \(%{JAVAFILE:file}:%{NUMBER:line}\) \-%{GREEDYDATA:msg_3}"] 
       } 
       xml { 
        store_xml => "false" 
        source => "msg_3" 
        xpath =>[ 
        "/dialogue/server/text()" ,"server", 
        "/dialogue/duration/text()" ,"duration", 
        [...] 
        ] 
       } 
     } 

я я могу разбирать журналы JAVA и xml. Но с моими фильтрами (сообщение выше) logstash не может определить, где находится конец моих журналов </dialog>.

Выход выглядеть следующим образом:

"message" =><dialogue>\n<server>FirstLog</server>\n<duration>311</duration>\n[...]\n</dialogue>\nINFO 05-01-16 08:06:02 [http-nio-8080-exec-8] (AbstractServer.java:454) -\n<dialogue>\n<server>SecondLog</server>\n<duration>500</duration>\n[...]\n</dialogue>\nINFO 05-01-16 08:06:03 [http-nio-8080-exec-8] (AbstractServer.java:454) -\n<dialogue>\n<server>ThirdLog</server>\n<duration>100</duration>\n[...]\n</dialogue> 
    "level" => "INFO", 
    "timestamp" => "05-01-16 08:06:01", 
    "msg_1" => "http-nio-8080-exec-8", 
    "file" => "AbstractServer.java", 
    "xmldata" => <dialogue>\n<server>FirstLog</server>\n<duration>311</duration>\n[...]\n</dialogue>\nINFO 05-01-16 08:06:02 [http-nio-8080-exec-8] (AbstractServer.java:454) -\n<dialogue>\n<server>SecondLog</server>\n<duration>500</duration>\n[...]\n</dialogue>\nINFO 05-01-16 08:06:03 [http-nio-8080-exec-8] (AbstractServer.java:454) -\n<dialogue>\n<server>ThirdLog</server>\n<duration>100</duration>\n[..]\n</dialogue> 
    "server" => [ [0] "FirstLog" ], 
    "duration" => [ [0] "311" 

и logstash является разбор только первый журнал XML и не рассматривает другие 2. Мой конечный результат должен быть:

{ 
    "message" => <dialogue>\n<server>FirstLog</server>\n<duration>311</duration>\n[...]\n</dialogue> 
    "level" => "INFO", 
    "timestamp" => "05-01-16 08:06:01", 
    "msg_1" => "http-nio-8080-exec-8", 
    "file" => "AbstractServer.java", 
    "xmldata" => <dialogue>\n<server>FirstLog</server>\n<duration>311</duration>\n[...]\n</dialogue> 
    "server" => [ [0] "FirstLog" ], 
    "duration" => [ [0] "311" 
} 
{ 
    "message" => <dialogue>\n<server>SecondLog</server>\n<duration>500</duration>\n[...]\n</dialogue> 
    "level" => "INFO", 
    "timestamp" => "05-01-16 08:06:02", 
    "msg_1" => "http-nio-8080-exec-8", 
    "file" => "AbstractServer.java", 
    "xmldata" =><dialogue>\n<server>SecondLog</server>\n<duration>500</duration>\n[...]\n</dialogue> 
    "server" => [ [0] "SecondLog" ], 
    "duration" => [ [0] "500" 
} 
{ 
    "message" => <dialogue>\n<server>ThirdLog</server>\n<duration>100</duration>\n[...]\n</dialogue> 
    "level" => "INFO", 
    "timestamp" => "05-01-16 08:06:03", 
    "msg_1" => "http-nio-8080-exec-8", 
    "file" => "AbstractServer.java", 
    "xmldata" => <dialogue>\n<server>ThirdLog</server>\n<duration>100</duration>\n[...]\n</dialogue> 
    "server" => [ [0] "ThirdLog" ], 
    "duration" => [ [0] "100" 
} 

Я надеюсь, это яснее, и у кого-то есть время, чтобы дать мне еще несколько советов.

С уважением

+0

У кого-то есть ключ? – sanfrareau

ответ

0

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

Затем выйдите из уровня журнала, даты и т. Д. И поместите xml в поле собственного.

Наконец, используйте фильтр xml {} в новом поле xml.

+0

Спасибо, я изменил свой фильтр Я работаю тихо, хорошо, gork и xml разбирают линию, но теперь у меня есть одна строка. Теперь мои журналы стали: INFO 05-01-16 8:06:01 [HTTP-NiO-8080-Exec-8] (AbstractServer.java:454) - \ п \ п локальный \ п \ n [...] \ n \ nINFO 05-01-16 08:06:01 [http-nio-8080-exec-8] (AbstractServer.java:454) - \ n \ n localhost \ n \ n [...] \ n \ n [...] и я не знаю, как определить «конечную линию», потому что выше у меня есть 2 разных журнала. С уважением – sanfrareau

+0

Обновите свою запись в новой конфигурации. –

+0

Я обновил сообщение – sanfrareau