Поиск шаблона grok для файла с различной структурой - PullRequest
1 голос
/ 29 мая 2020

У меня есть файл журнала, в котором не все строки имеют одинаковый формат. Как мне найти правильный шаблон Grok для такого файла.

[15:37:20:030|1] [TdmUtil.c: 1534:fnTDM_LoadLocalFoo] F_LAA       : 1
[15:37:20:032|1] [TdmUtil.c: 1281:fnTDM_GetPreDef]  pdeGetData : MAX_IRAT_NBR_PER_SERVED_CELL_SYS = 256
[15:37:20:091|1] [TdmUtil.c:  293:fnTDM_PrtIndexKey] fnTDM_GetIndexKeyNum Error!!

Таким образом, некоторые строки имеют формат line1, некоторые - формат line2 и так далее. Я мог бы написать образец грока для каждой из этих строк, но понятия не имею, как их объединить. Есть ли способ решить эту проблему?

1 Ответ

2 голосов
/ 31 мая 2020

Я собрал для вас кое-что. но прежде чем я поделюсь им с вами, я предлагаю вам поработать с онлайн-отладчиком GROK, чтобы написать свой шаблон GROK (внутри Kibana есть 1, если вы работаете с ним в Dev Tools -> отладчик GROK). Вы также должны проверить доступные шаблоны GROK .

Я вижу, что все 3 строки имеют одинаковый префикс, который равен [time|num] [class: line number: function name] log text. Я создал для этого шаблон GROK. если вы хотите разбить log text дальше, вы можете сделать это, раскомментируя второе совпадение в поле text и предоставив необходимый шаблон Grok.

ПРИМЕЧАНИЕ: вы можете добавить столько же match разделы, как вы хотите, но будьте осторожны, он попытается запустить матч на всех из них. попробуйте использовать операторы if else для навигации для высокой сложности - обычно это не требуется.

input {
    file {
        path => "C:/work/elastic/logstash-6.5.0/config/test.txt"
        start_position => "beginning"
        codec => multiline {
            pattern => "^\[%{TIME}\|"
            negate => true
            what => "previous"
        }
        type => "whatever"
    }
}
filter {
    if [type] == "whatever" {
        grok {
            break_on_match => false
            match => { "message" => "^\[%{TIME:time}\|%{NUMBER:num}\]%{SPACE}\[%{DATA:class}:%{SPACE}%{NUMBER:linenumber:int}:%{DATA:function}\]%{GREEDYDATA:text}$"}
            #match => { "text" => ""}
        }
    }
}

output {
    elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "test"
    }
}

Приведенный выше файл конфигурации предоставит вам следующие поля в Kibana:

enter image description here

...