Вопрос или проблема
Я пытаюсь извлечь логи из файла журналов, используя команду 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", но вам нужен весь стек вызовов вместе с основной строкой журнала.
Решение:
Для достижения вашей цели вам нужно получить не только строки с исключениями, но и след за ними строки со стеком вызовов. Вот как это можно сделать:
-
Использование команды
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
позволяют получить одну строку перед основным исключением и две строки после, где обычно располагается стек вызовов. -
Использование
awk
для фильтрации и дальнейшей обработки данных:
Воспользуйтесь командойawk
, чтобы более точно фильтровать и извлекать данные.awk '/SECJ0373E:/,/^$/' SystemOut.log | awk '$0 ~ /^\[.*07:/'
Здесь первая часть команды извлекает блоки текста, начиная с "SECJ0373E:" до пустой строки. Затем второй
awk
фильтрует только те строки, где время начала 07:00. -
Создание дополнительного файла для анализа:
Чтобы облегчить дальнейшие манипуляции с данными, вы можете сначала извлечь все желаемые блоки в отдельный файл, а затем провести дополнительный анализ с использованием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
в связке обеспечит точность и удобство в обращении с логами.