从日志中获取异常以及stacktrace

时间:2015-01-19 10:17:49

标签: bash unix awk sed

我正在尝试从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 "," '$1 >= sd && $1 <= ed' $k

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

这可能就是你要找的东西:

$ cat tst.awk
/^[^[:blank:]]/ {
    dt = $1 " " $2
    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\:.*"在您的问题中的目的是什么 - 如果它有目的请更新您的问题以澄清具体的样本输入和输出显示它的用途和我&#39 ; ll用你需要的任何微不足道的调整来更新这个答案。