Извлечение журналов из файла журнала с помощью grep

Вопрос или проблема

Я пытаюсь извлечь логи из файла журналов, используя команду grep, и формат файла журналов следующий:

[1/10/16 23:55:33:018 PST] 00000057 ServerObj E   SECJ0373E: Exception message
at com.own.ws.wim.util.UniqueNameHelper.formatUniqueName(UniqueNameHelper.java:102)
at com.own.ws.wim.ProfileManager.getImpl(ProfileManager.java:1569)

До сих пор мне удавалось извлекать логи, но я хочу также получить трассировку стека.

grep -i '^[[:space:]]*at' --before-context=2 SystemOut.log | grep "1/13/16 7:[1-60]" 

output : [1/10/16 23:55:33:018 PST] 00000057 ServerObj E   SECJ0373E: Exception message

Есть идеи, как это можно сделать?

Awk с разделителем полей “at” также может работать. “^[” соответствует строкам, начиная с метки даты, и $1 – это первое поле.

awk -F"at" '/^\[/{print $1}' test

Основываясь на вашем комментарии и если я правильно понял, что вам нужно, команда awk должна включать строки, которые вы ищете с помощью вашего диапазона grep между 7 и 8 часами.

Однако, похоже, вам нужны два списка. Чтобы сделать это, вы могли бы запустить команду awk на вашем файле журнала и вывести его в другой файл. Затем вы могли бы awk/grep второй файл.

awk -F"at" '/^\[/{print $1}' test>> ExtractedLogs.txt
awk -F"at" '$1 ~ "07:"{print $1}' ExtractedLogs.txt>> StackTraceOnly.txt

Вы могли бы добавить –after-context=2, чтобы добавить другие строки после поиска строки “at”:

grep -i '^[[:space:]]*at' --before-context=2 afile | grep --after-context=2 "1/13/16 7:[1-60]"

Ответ или решение

Конечно, ниже приведен подробный ответ на вопрос о получении логов из файла журналов с использованием команды grep.

Задача: Вам необходимо извлечь строки журналов вместе со стеком вызовов из файла журнала. Формат строки журнала следующий:

[1/10/16 23:55:33:018 PST] 00000057 ServerObj E   SECJ0373E: Exception message
at com.own.ws.wim.util.UniqueNameHelper.formatUniqueName(UniqueNameHelper.java:102)
at com.own.ws.wim.ProfileManager.getImpl(ProfileManager.java:1569)

Текущий вывод:
Команда grep, которую вы используете, извлекает только строки, начинающиеся с "at", но вам нужен весь стек вызовов вместе с основной строкой журнала.

Решение:
Для достижения вашей цели вам нужно получить не только строки с исключениями, но и след за ними строки со стеком вызовов. Вот как это можно сделать:

  1. Использование команды grep с контекстом:
    Вы можете использовать комбинированный подход с --before-context и --after-context для извлечения необходимого числа строк до и после основной строки.

    grep -i 'SECJ0373E:' --after-context=2 --before-context=1 SystemOut.log | grep "1/13/16 7:[0-5][0-9]"

    В этой команде ключи --before-context=1 и --after-context=2 позволяют получить одну строку перед основным исключением и две строки после, где обычно располагается стек вызовов.

  2. Использование awk для фильтрации и дальнейшей обработки данных:
    Воспользуйтесь командой awk, чтобы более точно фильтровать и извлекать данные.

    awk '/SECJ0373E:/,/^$/' SystemOut.log | awk '$0 ~ /^\[.*07:/'

    Здесь первая часть команды извлекает блоки текста, начиная с "SECJ0373E:" до пустой строки. Затем второй awk фильтрует только те строки, где время начала 07:00.

  3. Создание дополнительного файла для анализа:
    Чтобы облегчить дальнейшие манипуляции с данными, вы можете сначала извлечь все желаемые блоки в отдельный файл, а затем провести дополнительный анализ с использованием grep или awk.

    grep -i 'SECJ0373E:' --after-context=5 SystemOut.log > extracted_logs.txt
    awk -F"at" '$0 ~ "07:" {print $1}' extracted_logs.txt > final_output.txt

    Теперь у вас есть файл final_output.txt, где содержится полный стек вызовов в течение нужного времени.

Заключение: Такая методология позволяет наиболее эффективно обрабатывать логи и извлекать из них необходимую информацию в зависимости от временных меток и других критериев. Использование команд grep и awk в связке обеспечит точность и удобство в обращении с логами.

Оцените материал
Добавить комментарий

Капча загружается...