首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

使用 Perl 與 Shell 腳本高效提取 Log4j 錯誤日誌

     編輯:Java 相關知識

前言

在 Java 專案的日常維護中,從龐大的 Log4j 日誌檔案中快速定位 ERROR 級別的錯誤資訊是運維人員的常態需求。本文介紹一種結合 Perl 腳本與 Shell 自動化流程的方案,能夠高效解析日誌、統計錯誤頻率並自動郵件通知,顯著提升排錯效率。

核心 Perl 解析腳本

以下 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";
}

關鍵邏輯解析

  • 正則匹配:精準捕獲 ISO 8601 時間格式與 ERROR 關鍵字後的完整錯誤堆疊。
  • 哈希分組:以錯誤訊息為 Key,時間戳陣列為 Value,自動去重並記錄所有發生時間。
  • 編碼轉換:輸出前將 UTF-8 轉為 GBK,避免中文亂碼。

Shell 自動化調度腳本

配合 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

流程說明

  1. 動態計算前一天日期(date -d '-1 day'),自動適配日誌滾動命名規則。
  2. 依序分析多個應用節點的日誌(meganotes 與 schedule),結果追加寫入同一臨時檔。
  3. 以日期為主題發送郵件,內容即為 Perl 腳本的結構化輸出。
  4. 執行結束自動清理臨時檔,避免磁碟佔用。

實際輸出範例

>>>>>>>>/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

輸出清晰呈現:錯誤來源類/行號、具體異常描述、發生時間序列,運維人員可直接定位問題代碼。

部署建議

  • 將 Perl 腳本放置於統一腳本目錄(如 /data/apps/shell/),賦予執行權限。
  • 在 crontab 中配置每日凌晨執行:0 1 * * * /data/apps/shell/daily_error_report.sh
  • 郵件接收者建議設置為技術群組郵件列表,支援多人協同跟進。

總結

此方案以輕量級腳本組合替代重型日誌分析平台,零依賴、部署簡單,特別適合中小型 Java 應用叢集的日常錯誤巡檢。核心優勢在於「分組統計 + 時間序列」的輸出格式,讓錯誤趨勢一目瞭然。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved