0

私の (既存の) perl ファイルは、次の形式で Log4Perl を使用してログ ファイルを作成します。

[2011-11-21 08:50:22,406] States_Sync INFO Logger.pm:33 script starts
[2011-11-21 08:50:22,610] States_Sync ERROR Logger.pm:36 Error occurred ....
[2011-11-21 08:50:22,406] States_Sync INFO Logger.pm:33 ...
[2011-11-21 08:50:22,610] States_Sync ERROR Logger.pm:36 Error occurred ....
[2011-11-21 08:50:22,406] States_Sync INFO Logger.pm:33 ...
[2011-11-21 08:50:22,610] States_Sync ERROR Logger.pm:36 Error occurred ....

上記は私のログファイルのほんの一例です。次のフォーマッタを使用します

$layout = Log::Log4perl::Layout::PatternLayout->new("[%d{ISO8601}] %c %p %F{1}:%L %m%n");

現在、エラーが発生した場合に備えてメールを送信する必要があります。

既存のスクリプトを変更する代わりに、生成されたログ ファイルをエラーのみ解析し、ログ ファイルから「エラー」に関連するすべてのメッセージを電子メールとして送信することを考えました。

ログファイルを解析する簡単な方法はありますか?

よろしく、

カーシック

4

4 に答える 4

3

grep(1) を使用します。

grep ERROR log.file

またはperlを使用します:

perl -ne 'print if /ERROR/' log.file
于 2011-12-12T14:02:58.520 に答える
1

私はこれを試すかもしれません:

if ( /^[^:]+?\s+ERROR\s/ ) {
    # pull fields
    # send email
}

これを試して、行数が多すぎるかどうかを確認してください。より精巧なバージョンは次のようになります。

if ( /^\[\d{4}-\d\d-\d\d \d\d:\d\d:\d\d,\d{3}\]\s+([\w\s])?\s+ERROR\s+/ ) {

ただし、データがより複雑な場合のみ。

于 2011-12-12T14:01:09.567 に答える
0

log4perlを使用しているので、そこに組み込まれているメソッドを使用して、エラー(またはそれ以上)をチェックし、それに基づいて電子メールを送信できます。

if ($layout->is_error()){
  # Put e-mail logic here
}

また、エラー情報だけが必要で、警告、情報、デバッグ、トレースは必要ない場合は、次の操作を実行できます。

if($layout->is_error() && ! $layout->is_warn()){
  # Put e-mail logic here
}
于 2011-12-12T14:11:50.570 に答える
0

ログ ファイルを確認して電子メールを送信する頻度が指定されていません。1 日に 1 回の場合は、tadmc が提供するソリューションが最適です。

ただし、これを自動化し、新しい ERROR エントリが発生するたびに特定の時間間隔 (maxinterval を参照) 後に電子メールを送信する場合は、次のことを確認してください。

注 #1 必要に応じて間隔と最大間隔を調整して、人々に電子メールが殺到しないようにします 注 #2 ログのローテーション間隔に従って実行します

#!/usr/bin/perl

use strict;
use warnings;
use File::Tail;

my @logs_to_email;
my $log_file = "file.log";

my $error_pattern = qr(^\[.*?\]\s*States_Sync\s*ERROR);

my $tail = File::Tail->new(
        name => $log_file,
        maxinterval => 60,
        interval => 10,
        adjustafter => 10,
);

while (defined (my $line = $tail->read)) {
        chomp $line;
        next if $line =~ /^\s*$/;
        next unless $line =~ $error_pattern;
        push @logs_to_email, $line;
        ##
        ##  put e-mail logic to send
        ##    @logs_to_email here
        ##
}
于 2011-12-15T08:31:53.430 に答える