Назад | Перейти на главную страницу

Отфильтровать вывод файла журнала

Вопрос
У меня есть файл журнала, в котором отображаются все журналы консоли моего веб-сайта в диапазоне от 10 октября до 1 ноября, начиная с журналов 10 октября.
Мне нужны все журналы с 25 октября до сегодняшнего дня.

Проблема в том, что есть огромное исключение. Каждый день я получаю исключение IOException для 21 строки, и это для 6030 пользователей, так что есть около 126 600 строк кода, которые я не увижу; в день.

Поэтому мне нужно отфильтровать вывод, чтобы снова иметь возможность нормально читать журналы.

Что я уже пробовал:

less catalina.out | grep -v "java.io.IOException: Server returned HTTP response code: 401 for URL"  

Файл журнала называется catalina.out. Но это не мой код, который не скрывает исключение, и я не могу прокручивать вывод.
Так что я делаю не так? Каким должен быть код?


ИНФОРМАЦИЯ обо мне
Я НЕ знаком с Linux. Я работаю в группе поддержки, но сегодня я одна и с сайтом возникли проблемы. Так что мне нужно исправить это самому.
Я погуглил сейчас 45 минут, но не понимаю, и проблема торопится ... Так что, пожалуйста, проявите ко мне терпение ...


ИНФОРМАЦИЯ о проблеме
Вот все факты и информация, которые я знаю о моей проблеме:
LOG-имя файла: catalina.out
Полное исключение IOException, которое я хочу скрыть и повторять 6030 раз в день:

java.io.IOException: Server returned HTTP response code: 401 for URL: http://secure.intern.webpage/userpicture/u117054.jpg
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1625)
        at java.net.URL.openStream(URL.java:1037)
        at ch.sbb.wzuapp.business.batch.PersonCleanupNightlyJob.downloadUrl(PersonCleanupNightlyJob.java:270)
        at ch.sbb.wzuapp.business.batch.PersonCleanupNightlyJob.downloadPic(PersonCleanupNightlyJob.java:245)
        at ch.sbb.wzuapp.business.batch.PersonCleanupNightlyJob.doCleanup(PersonCleanupNightlyJob.java:76)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:64)
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53)
        at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)

Единственное, что изменяется в каждом исключении, - это имя изображения. Все остальное всегда то же самое.

grep умеет принимать файлы в качестве аргументов. Пожалуйста, проверьте мужчину. Вы могли бы использовать egrep, вместо того grep -e (что то же самое):

# egrep -v '^java.io|^\ {8}at' catalina.out | less

Хорошо, действительно интересная проблема, учитывая, что она должна работать в конце трубы. Могут быть более простые способы сделать это, но я обнаружил, что этот работает (и он использует Швейцарская армейская бензопила, perl):

tail -f catalina.out | perl -n -e '{ if (/^java.io.IOException: Server returned HTTP response code: 401/) { $ignore=1;} elsif ($ignore>=1 and $ignore<20) {$ignore++;} else {$ignore=0; print $_;}  }'

Обычно он проходит через STDIN по одной строке за раз, ища строку поиска ("^ java.io.IOException: сервер вернул код ответа HTTP: 401"). Пока он не найден, он печатает каждую строку по мере ее поступления; как только он найден, он начинает отсчет до 20, один раз для каждой новой строки, ничего не печатая, пока он считает; как только счет достигает 20, он сбрасывает счетчик до нуля и возобновляет печать каждой новой строки в.

редактировать: Нет проблем. Начать с tail -100000f catalina.out | ..., или даже большее число, если в файле журнала больше строк. Если вы не хотите видеть новые элементы по мере их добавления, попробуйте

perl -n -e '{ if (/^java.io.IOException: Server returned HTTP response code: 401/) { $ignore=1;} elsif ($ignore>=1 and $ignore<20) {$ignore++;} else {$ignore=0; print $_;}  }' < catalina.out.

Он предназначен для использования в конвейере, поэтому вы можете кормить его всем, что хотите, и вы можете отправлять результат на все, что в нем нуждается. Это способ UNIX!

Если вы хотите полностью игнорировать исключения, вы можете попробовать следующее:

cat catalina.out | grep -v -e '^java.io.IOExc' -e '       at ' | less

(замените 7 пробелов табуляцией [Ctrl + V, затем Tab], если это не сработает)

Если потребуется дополнительное удаление, мы начнем perl-grepping.