在 Java 專案的日常維護中,從龐大的 Log4j 日誌檔案中快速定位 ERROR 級別的錯誤資訊是運維人員的常態需求。本文介紹一種結合 Perl 腳本與 Shell 自動化流程的方案,能夠高效解析日誌、統計錯誤頻率並自動郵件通知,顯著提升排錯效率。
以下 Perl 程式專門用於掃描指定日誌檔案,提取符合「時間戳 + ERROR + 錯誤訊息」格式的行,並按錯誤訊息分組統計發生次數與時間點:
#!/bin/perl
use Encode;
open(NOTESFILES, $ARGV[0]);
my %errorMeganotes;
print ">>>>>>>>>>", $ARGV[0], "<<<<<<<<<<\n";
while (<NOTESFILES>) {
# 匹配格式:2009-02-18 15:53:54 ERROR 具體錯誤內容
if ($_ =~ /^(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s+ERROR\s+(.*)\s/g) {
if ($errorMeganotes{$2}) {
push @{$errorMeganotes{$2}}, $1;
} else {
$errorMeganotes{$2} = [$1];
}
}
}
for (keys %errorMeganotes) {
my $tmp_keys = $_;
my @tmp_array = @{$errorMeganotes{$tmp_keys}};
print "error number :>>", scalar(@tmp_array), "<<\n",
encode("GBK", decode("UTF-8", $tmp_keys)), "\n",
join(",\t", @tmp_array), "\n\n\n";
}
配合 crontab 定時執行,實現「每日日誌分析 → 彙總報告 → 郵件發送 → 清理臨時檔」的完整閉環:
#!/bin/sh
nowDate=$(date -d '-1 day' +%Y-%m-%d)
echo $nowDate
perl /data/apps/shell/meganotesErrorLog.pl /data/apps/meganotes/tomcat/logs/app/app.log.$nowDate > _tmp_$nowDate
perl /data/apps/shell/meganotesErrorLog.pl /data/apps/schedule/tomcat/logs/app/app.log.$nowDate >> _tmp_$nowDate
mail -s "$nowDate-ERROR-log" my@mail.com < _tmp_$nowDate
rm _tmp_$nowDate
date -d '-1 day'),自動適配日誌滾動命名規則。>>>>>>>>/data/apps/meganotes/tomcat/logs/app/app.log.2009-02-18<<<<<<<<<
error number :>>2<<
MusicActionOpLogProxy:142 - music.popularTime=[Invalid field value for field "music.popularTime".]
2009-02-18 15:53:54, 2009-02-18 16:00:12
輸出清晰呈現:錯誤來源類/行號、具體異常描述、發生時間序列,運維人員可直接定位問題代碼。
/data/apps/shell/),賦予執行權限。0 1 * * * /data/apps/shell/daily_error_report.sh此方案以輕量級腳本組合替代重型日誌分析平台,零依賴、部署簡單,特別適合中小型 Java 應用叢集的日常錯誤巡檢。核心優勢在於「分組統計 + 時間序列」的輸出格式,讓錯誤趨勢一目瞭然。