我正在编写一个 node.js 函数来 ssh 到远程机器,并尝试从各种不同的日志文件中抓取日志以查找异常。日志文件的重要部分如下所示:
.... gunk ....
2013-01-29 04:06:39,133 com.blahblah.BaseServlet processRequest Thread-1629 Site-102 Cons-0 Url-http://theurlthat.com/caused/the/problem App-26 yada yada yada
java.lang.NullPointerException
at com.blahblah.MyClass.hi(MyClass.java:173)
at com.blahblah.StandardStackTrace.main(StandardStackTrace.java:125)
at com.blahblah.SoOnAndSo.forth(SoOnAndSo.java:109)
at java.lang.Thread.run(Thread.java:595)
2013-01-29 04:06:39,133 com.blahblah.BaseServlet defaultThrowableHandler Thread-1629 Site-102 Cons-0 Url-http://theurlthat.com/caused/the/problem App-26 yad yada yada
TechnicalDifficultiesException: TD page delivered by handleThrowable
http://theurlthat.com/caused/the/problem
....more gunk....
我需要在日志文件中找到满足以下三个要求的异常和对应的日期:
例外必须是此静态文本之前的第一个:
TechnicalDifficultiesException:handleThrowable 传递的 TD 页面
异常必须直接位于具有“BaseServlet.*Site-102”的两行之间
异常必须是满足上述条件的日志文件中最近的(最后一个)。日志会定期翻转,因此它必须是 Log 中的最后一个,或者如果不存在则 Log.001 中的最后一个,或者如果不存在则 Log.002 中的最后一个等。
由于该程序必须通过 ssh 连接到许多潜在服务器之一,因此最好只在 node.js 程序中维护逻辑,而不是在有日志的机器上维护。因此,perl/sed/awk/grep/etc 中的单行将是最理想的。