Разбор многострочного файла журнала переменной длины - PullRequest
7 голосов
/ 02 февраля 2010

Я хочу иметь возможность использовать решение, подобное 'grep' или 'pcregrep -M', которое анализирует файл журнала, который соответствует следующим параметрам:

  • Каждая запись в журнале может быть длиной в несколько строк
  • В первой строке записи журнала есть ключ, который я хочу найти
  • Каждая клавиша появляется более чем на одной строке

Так что в приведенном ниже примере я хотел бы вернуть каждую строку с KEY1 и все вспомогательные строки под ней до следующего сообщения журнала.

Log file:
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext
        blah
        blah2 T
        blah3 T
        blah4 F
        blah5 F
        blah6
        blah7
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse
01 Feb 2010 - 10:39:01.758, DEBUG - KEY2:randomtest
this is a test
01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here
this is another multiline log entry
keeps on going
but not as long as before
01 Feb 2010 - 10:39:01.763, DEBUG - KEY2:testing
test test test
end of key2
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
okay enough
01 Feb 2010 - 10:39:01.762, DEBUG - KEY3:and so on
and on
Desired output of searching for KEY1:
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext
        blah
        blah2 T
        blah3 T
        blah4 F
        blah5 F
        blah6
        blah7
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse

01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here
this is another multiline log entry
keeps on going
but not as long as before
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
okay enough

Я пытался сделать что-то вроде:
pcregrep -M 'KEY1 (. * \ n) +' logfile
но определенно не работает правильно.

Ответы [ 3 ]

9 голосов
/ 02 февраля 2010

если вы используете * nix, вы можете использовать оболочку

#!/bin/bash
read -p "Enter key: " key
awk -vkey="$key" '
$0~/DEBUG/ && $0 !~key{f=0}
$0~key{ f=1 }
f{print} ' file

выход

$ cat file
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext
        blah                                       
        blah2 T                                    
        blah3 T                                    
        blah4 F                                    
        blah5 F                                    
        blah6                                      
        blah7                                      
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse
01 Feb 2010 - 10:39:01.758, DEBUG - KEY2:randomtest  
this is a test                                       
01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here 
this is another multiline log entry                    
keeps on going                                         
but not as long as before                              
01 Feb 2010 - 10:39:01.763, DEBUG - KEY2:testing       
test test test                                         
end of key2                                            
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going                                                        
and going
and going
and going
okay enough
01 Feb 2010 - 10:39:01.762, DEBUG - KEY3:and so on
and on

$ ./shell.sh
Enter key: KEY1
01 Feb 2010 - 10:39:01.755, DEBUG - KEY1:randomtext
        blah
        blah2 T
        blah3 T
        blah4 F
        blah5 F
        blah6
        blah7
01 Feb 2010 - 10:39:01.757, DEBUG - KEY1:somethngelse
01 Feb 2010 - 10:39:01.760, DEBUG - KEY1:more logs here
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:eve more here
this is another multiline log entry
keeps on going
but not as long as before
01 Feb 2010 - 10:39:01.762, DEBUG - KEY1:but key 1 is still going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
and going
okay enough
0 голосов
/ 10 февраля 2017

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

Может быть, вы найдете это полезным. Работает на Windows и Linux (Mono)

Смотрите здесь: https://github.com/iohn2000/ParLog

Инструмент для фильтрации файлов журнала для записей журнала, которые содержат определенный (регулярное выражение) шаблон. Работает также с многострочными записями журнала. например: показывать только записи журнала из определенного экземпляра рабочего процесса. Записывает результат в стандартный вывод. Используйте '>' для перенаправления в файл

startPattern по умолчанию:

^[0-9]{2} [\w]{3} [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}

соответствует формату даты: например, 04 февраля 2017 г. 15: 02: 50,778

Параметры:

f:wildcard      a file name or wildcard for multiple files
p:pattern       the regex pattern to filter the file(s)
s:startPattern  regex pattern to define when a new log entry starts

Пример:

ParLog.exe -f=*.log -p=findMe
0 голосов
/ 02 февраля 2010

Добавление к ответу ghostdog74 (большое спасибо, кстати, прекрасно работает)

Теперь принимает данные командной строки в форме "./parse file key" и обрабатывает уровни журналов ERROR, а также DEBUG

#!/bin/bash
awk -vkey="$2" '
$0~/DEBUG|ERROR/ && $0 !~key{f=0}
$0~key{ f=1 }
f{print} ' $1
...