これまでのところ、フォーラムで解決策や支援を見つけられないという要件があります...
問題:リアルタイムシステムを監視すると、これらは毎日ロールオーバーする非常に大きなログファイルを多数生成します。1GBは珍しいことではありません。私が行うことは、既知のエラー状態についてログ(末尾)を調べることです。または、監視したいその他の文字列。アクションを実行する必要がある場合があります。
この種の作業は時間と手間がかかり、人為的エラーがログ内の問題を見逃しやすいため、私はこのログファイルの監視を自動化しています。Servers Aliveという製品を使用してスケジュールされたチェックを実行し、ログファイルを監視して、サービスの問題を示している可能性のあるログエントリの発生を監視します。必要に応じて、他のスクリプトを呼び出してサービスを再起動できます。発生した問題を解決するため。
私は以前にPerlを使用してこれらのログ監視タスクのスクリプトを作成しましたが、これらのスクリプトは非常に高速ですが、必ずしもこれを行うための最もクリーンな方法ではありません。私はプログラマーではなく管理者であるため、開発者の方法論や経験がありません。に頼る。
以下のPerlコードスニペットは、ログファイルを「開いて」、ファイル$logfile
の最後から特定の量のデータを「シーク」して、この時点からファイルの最後までデータを検索することを示しています。監視したいログエントリ。この例では、ログエントリは「No packet received from EISEC Client
」です。
この例では、監視しているログエントリは、EISECサービスの問題を示しており、サービスを再起動するだけで通常は問題が解決します。これらはすべて、スケジュールされたチェックおよびアラートメカニズムとしてServersAliveを自動的に利用します。
Perlスクリプト関数
sub checkEisecSrvloggedon {
print "$logfile\n";
if (open (EISECSRV_LOGGEDON, $logfile)) {
seek (EISECSRV_LOGGEDON, -40000, 2);
$line = <EISECSRV_LOGGEDON>;
$eisecsrvloggedon_ok = 0;
while ($line = <EISECSRV_LOGGEDON>) {
if ($line =~/No packet received from EISEC Client/) {
#increment counter
++$eisecsrvloggedon_ok;
}
}
}
}
Windows Server 2008R2およびWindows7クライアントに移行したので、可能であればPowerShellを使用してこのソリューションを実装したいと思いますが、これを効率的に、迅速に、大きなメモリオーバーヘッドなしで実行する方法の詳細がわかりません。
Get-Contentベースのソリューションを試しましたが、ログファイル全体を読み取る必要があるため、ログファイルのクエリに時間がかかりすぎるため、これらのタイプのソリューションは使用できなくなります。場合によっては数分に1回、非常に定期的にこれらの大きなログファイルの数をチェックできるようにする必要があります。ログファイルの末尾をテーリングするのに最適なテールタイプのソリューションを見てきましたが、これらのスクリプトはSystem.IO.File
メソッドを使用しています。これにより、スクリプトで達成したいパフォーマンス/速度が得られますが、PowerShellに精通していないため、この方法を使用して大きなログファイルの最後にすばやく到達し、所定の量のデータを入力してから、このログセクションで関連する文字列を検索します。
誰かアイデアはありますか?