Filtrar a saída de um arquivo de log

3

Pergunta
Eu tenho um arquivo de log que exibe todos os logs de console do meu site na faixa de 10.Oct para 1.Nov, comece com os logs de 10.Oct.
Eu preciso de todos os logs do intervalo de 25.Oct até hoje.

O problema é que há uma enorme exceção. Todos os dias recebo uma IOException com mais de 21 linhas e para 6030 usuários, então existem cerca de 126'600 linhas de código que não vejo; por dia.

Então eu preciso filtrar a saída para poder ler os logs normais novamente.

O que eu já tentei:

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

O arquivo de log é chamado catalina.out . Mas o meu código não esconde a exceção, e eu não sou capaz de percorrer a saída.
Então, o que estou fazendo errado? Como deve ser o código?

INFORMAÇÕES sobre mim
Eu não estou familiarizado com o Linux. Eu trabalho em um grupo de apoio, mas hoje estou sozinho e um site faz alguns problemas. Então eu preciso consertar isso sozinho.
Eu google agora por 45 minutos, mas não entendi e o problema se apressa ... Então, por favor, seja paciente comigo ...

INFO fala sobre o problema
Aqui todos os fatos e informações que eu conheço sobre o meu problema:
LOG-File Name: catalina.out
Toda a IOException que eu quero esconder e ser repetida 6030 vezes por dia:

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)

A única coisa que muda em cada exceção é o nome da imagem. Todo o resto é sempre o mesmo.

    
por Michael Schmidt 01.11.2013 / 11:33

3 respostas

3

OK, problema genuinamente interessante, dado que tem que funcionar no final de um cano. Pode haver maneiras mais fáceis de fazer isso, mas eu achei que este funcionava (e ele usa o Motosserra do Exército Suíço , 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 $_;}  }'

Basicamente, ele percorre uma linha STDIN por vez, procurando a cadeia de caracteres de pesquisa (" ^ java.io.IOException: Server retornou o código de resposta HTTP: 401 "). Até ser encontrado, imprime cada linha à medida que entra; uma vez encontrada, começa a contar até 20, uma vez para cada nova linha, imprimindo nada enquanto conta; quando a contagem chega a 20, redefine a contagem para zero e retoma a impressão de cada nova linha.

Editar : não tem problema. Comece com tail -100000f catalina.out | ... ou, na verdade, um número maior ainda se o arquivo de log tiver mais linhas do que isso. Se você não quiser ver as novas coisas conforme elas são adicionadas, tente

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.

Ele foi projetado para uso em um pipeline, para que você possa alimentá-lo da maneira que quiser, e enviar a saída para qualquer necessidade. É o jeito do UNIX!

    
por 01.11.2013 / 11:59
3

grep sabe usar arquivos como argumentos. Por favor, verifique o homem. Você poderia usar egrep , em vez de grep -e (que é o mesmo):

# egrep -v '^java.io|^\ {8}at' catalina.out | less
    
por 01.11.2013 / 13:11
1

Se você deseja ignorar totalmente as exceções, convém tentar isso:

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

(substitua os 7 espaços por uma tabulação [Ctrl + V e Tab] se isso não funcionar)

Se precisar de mais remoção, iniciaremos o perl-grep.

    
por 01.11.2013 / 11:48