从日志中获取异常以及堆栈跟踪

Fetch Exceptions from logs along with stacktrace

我正在尝试从日志中获取异常以及 StackTrace。 日志格式如下。

[2015-01-07 18:39:18,212] host123 WARN com.host123 .elf.UserQuest - Quest/option {o.q.more.paper.osc#0} references unknown dependent {t.what.form.file.more.action} in application {src-code}. Please revise.
[2015-01-07 18:39:18,212] host123 WARN com.host123 .elf.UserQuest - Quest/option {o.q.more.paper.osc#1} references unknown dependent {t.what.form.file.more.action} in application {src-code}. Please revise.
[2015-01-07 18:40:34,281] cessor32 ERROR com.host123 .email.DirectMailer - Unable to connect to server {1.1.1.1}:
       javax.mail.MessagingException: Could not connect to SMTP host: 1.1.1.1, port: 25, response: 451
       at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:996)
       at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:197)
       at javax.mail.Service.connect(Service.java:233)
       at javax.mail.Service.connect(Service.java:134)
       at com.host123.email.DirectMailer.deliverMessage(DirectMailer.java:191)
       at com.host123.email.DirectMailer.send(DirectMailer.java:153)
       at com.host123.webface.util.Notifications.sendEmailX(Notifications.java:126)
       at com.host123.webface.util.Notifications.sendEmail(Notifications.java:91)
       at com.host123.webface.util.Notifications.sendEmail(Notifications.java:145)
       at com.host123.edp.webface.action.DocRecoveryActionProcessor.perform(DocRecoveryActionProcessor.java:81 )

我正在使用此代码获取记录

sed -n '/${bb}/,/${aa}/p' ${k}|egrep "ERROR|ORA|Exception|at.*\.java\:.*"

其中 bb 是前一个日期,aa 是当前日期。 如果我只使用 sed 命令,那么我可以根据日期条件获取详细信息,但是将 egrep 与 sed 一起使用不会给出任何输出。

我也试过使用 awk 命令。

awk -v "sd=$aa" -v "ed=$bb" -F "," ' >= sd &&  <= ed' $k

我认为问题可能在于 awk 命令获取其中包含日期的行,而 StackTrace 行没有任何行。它可能正确也可能不正确。

此外,我正在从数以千计的日志文件中获取此信息如果有任何方法可以减少用于获取数据的内存量将非常有用。
任何帮助将不胜感激。

besc="\${bb}";aesc="\${aa}"

sed -n "/${besc}/,/${aesc}/ {
   /\(ERROR\)|\(ORA\)|\(Exception\)|\(at.*\.java\:.*\)/ p
   }" ${k}
  • 转义 [(或不使用它)
  • 通常不需要 egrep,sed 也可以在子进程中使用它

这可能是您要找的:

$ cat tst.awk
/^[^[:blank:]]/ {
    dt =  " " 
    found = ( ((sd=="")||(dt>=sd)) && ((ed=="")||(dt<=ed)) )
}
found

$ awk -v sd='[2015-01-07 18:40:34,281]' -f tst.awk file
[2015-01-07 18:40:34,281] cessor32 ERROR com.host123 .email.DirectMailer - Unable to connect to server {1.1.1.1}:
       javax.mail.MessagingException: Could not connect to SMTP host: 1.1.1.1, port: 25, response: 451
       at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:996)
       at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:197)
       at javax.mail.Service.connect(Service.java:233)
       at javax.mail.Service.connect(Service.java:134)
       at com.host123.email.DirectMailer.deliverMessage(DirectMailer.java:191)
       at com.host123.email.DirectMailer.send(DirectMailer.java:153)
       at com.host123.webface.util.Notifications.sendEmailX(Notifications.java:126)
       at com.host123.webface.util.Notifications.sendEmail(Notifications.java:91)
       at com.host123.webface.util.Notifications.sendEmail(Notifications.java:145)
       at com.host123.edp.webface.action.DocRecoveryActionProcessor.perform(DocRecoveryActionProcessor.java:81 )

如果您不指定 sd 它从文件的开头开始,如果您不指定 ed 它转到文件的末尾。如果您同时指定两者,您将获得该范围内的记录,包括在内。

我不知道你的问题中 egrep "ERROR|ORA|Exception|at.*\.java\:.*" 的目的是什么 - 如果它有目的,请更新你的问题以通过特定的示例输入和输出来说明它的用途,我会用任何需要做的微不足道的调整来更新这个答案来做你想做的事。