过滤日志文件的输出

过滤日志文件的输出

问题
我有一个日志文件,其中显示了我网站在 10 月 10 日至 11 月 1 日范围内的所有控制台日志,从 10 月 10 日的日志开始。
我需要从 10 月 25 日到今天的所有日志。

问题是存在一个巨大的异常。每天我都会收到超过 21 行的 IOException,而这涉及 6030 个用户,所以每天大约有 126'600 行代码我看不到。

所以我需要过滤输出才能再次正常读取日志。

我已经尝试过的:

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

日志文件名为catalina.out。但是我的代码没有隐藏异常,而且我无法滚动查看输出。
那么我做错了什么?代码应该如何?


关于我的信息
我不熟悉 Linux。我在一个支持小组工作,但今天我一个人,一个网站出了点问题。所以我需要自己修复它。
我现在在谷歌上搜索了 45 分钟,但没有找到答案,问题很快就出现了……所以请耐心等待……


有关问题的信息
以下是我所知道的有关我的问题的所有事实和信息:
日志文件名:catalina.out
我想要隐藏并每天重复 6030 次的整个 IOException:

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)

每次异常中唯一改变的是图片名称。其他内容始终相同。

答案1

好吧,这确实是一个有趣的问题,因为它必须在管道末端运行。可能有更简单的方法可以做到这一点,但我发现这个方法有效(它使用了系统管理员的瑞士军用电锯,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 方式!

答案2

grep知道将文件作为参数。请查阅手册。您可以使用egrep, 代替grep -e(这是相同的):

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

答案3

如果您想完全忽略异常,您可能需要尝试以下操作:

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

(如果不起作用,请用制表符 [Ctrl+V 然后按 Tab] 替换 7 个空格)

如果需要删除更多,我们将开始 perl-grepping。

相关内容