Вопрос
У меня есть файл журнала, в котором отображаются все журналы консоли моего веб-сайта в диапазоне от 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.