我正在开发脚本,它会查看最近一小时的日志并检查任何异常并发送solaris平台的电子邮件。
我做了以下步骤
grep -n -h date +'%Y-%m-%d %H:%M' test.logs
上面的命令给我行号,然后我跟着
tail +6183313 test.log | grep 'exception'
示例日志
2014-02-17 10:15:02,625 | WARN | m://mEndpoint | oSccMod | 262 - com.sm.sp-client - 0.0.0.R2D03-SNAPSHOT | 1201 or 101 is returned as exception code from SP, but it is ignored
2014-02-17 10:15:02,625 | WARN | m://mEndpoint | oSccMod | 262 - com.sm.sp-client - 0.0.0.R2D03-SNAPSHOT | SP error ignored and mock success returned
2014-02-17 10:15:02,626 | INFO | 354466740-102951 | ServiceFulfill | 183 - org.apache.cxf | Outbound Message
请建议任何更好的替代方案来执行上述任务。
答案 0 :(得分:8)
使用GNU date
,可以使用:
grep "^$(date -d -1hour +'%Y-%m-%d %H')" test.logs | grep 'exception'| mail -s "exceptions in last hour of test.logs" ImranRazaKhan
上面的第一步是选择过去一小时内的所有日志条目。这是通过grep
查找以年 - 月 - 日开始的所有行和一小时前匹配的小时来完成的:
grep "^$(date -d -1hour +'%Y-%m-%d %H')" test.logs
管道的下一步是从那些行中选择具有例外的那些:
grep 'exception'
管道中的最后一步是发送邮件:
mail -s "exceptions in last hour of test.logs" ImranRazaKhan
以上内容将邮件发送给ImranRazaKhan(或您选择的任何电子邮件地址),主题为“test.logs最后一小时的例外情况”。
不应低估-d
date
选项的便利性。从当前小时中减去1似乎很简单,但是,如果当前小时是12点,那么我们需要调整日期和小时。如果当月的第一个小时是凌晨12点,我们还必须更改月份。同样是一年。当然,2月在闰年需要特别考虑。
考虑三种情况:
在Solaris 11或更高版本下,GNU date
实用程序位于/usr/gnu/bin/date
。因此,我们只需要为date
指定路径:
grep "^$(/usr/gnu/bin/date -d -1hour +'%Y-%m-%d %H')" test.logs | grep 'exception'| mail -s "exceptions in last hour of test.logs" ImranRazaKhan
在Solaris 10或更早版本中,可以下载&安装GNU日期
如果GNU日期仍然不可用,我们需要找到另一种方法来查找一小时前的日期和时间。最简单的解决方法是选择一个比您的时区晚一个小时的时区。如果那个时区是香港,那么请使用:
grep "^$(TZ=HongKong date +'%Y-%m-%d %H')" test.logs | grep 'exception'| mail -s "exceptions in last hour of test.logs" ImranRazaKhan
答案 1 :(得分:0)
你可以这样做:
dt="$(date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S")"
awk -v dt="$dt" '$0 ~ dt && /exceltion/' test.logs
答案 2 :(得分:0)
扫描数百万行日志声音非常低效。我建议改变应用程序的log4j(看起来像什么)配置,每小时剪切一个新的日志文件。这样,拖尾最新的文件变得轻而易举。