• ベストアンサー

指定した日時以降に吐かれたアラートログの行を見つける方法

オラクルのアラートログに、ユーザーが指定した日時以降で「ORA-」が出力されていれば、 「エラーが発生しています」 と標準出力で表示するシェルスクリプト(Bシェル)を作成しようとしています(理由は初心者でも簡単にエラー発生有無を確認できるようにするため)。 (例) %sh alertlog_err_check.sh 20060710 1500 と実行した場合、 アラートログの2006年7月10日15時~現在までの間で1つでも「ORA-」が吐かれていれば、「エラーが発生しています」と出力。 ユーザーが指定した日時以降に吐かれたアラートログの行を見つけ、そこから最終行までの間でgrepコマンドにより「ORA-」を検索する方法を考えているのですが、ユーザーが指定した日時以降に吐かれたアラートログの行を見つけるロジックが思いつきません。 何か良い方法があればアドバイスをお願いします。 [環境] OS:Solaris9 DB:Oracle9i

質問者が選んだベストアンサー

  • ベストアンサー
  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.2

私はSolaris9/Oracle8しか使ったことないのですが、私の環境では、これで いけます。 私の理解では、日付の行のあとにメッセージがくる。 ただし、このスクリプトの動作確認は、アラートログをダウンロードして Windowsで行いました。(プラットフォーム非依存だ) しかし、アラートログを常に監視していて、メッセージが出力されたらメール などで通知する仕組みのほうが実用的ではないですか? うちでは、そうしています。 #!Perl # usage: ORAALART.pl yyyymmdd /path/to/alart.log # $Id: ORAALART.pl,v 1.0 2006-08-02 10:30 guci-ok Exp $ my $in_date = shift; # like "200608020911" die "Error date format '2yyymmddHHMM'" unless $in_date =~ /^2\d{3}\d{2}\d{2}\d{2}\d{2}$/; my %MONTH = qw(Jan 01 Feb 02 Mar 03 Apr 04 May 05 Jun 06 Jul 07 Aug 08 Sep 09 Oct 10 Nov 11 Dec 12); # search date my $date_found = 0; while (<>) { if (/^\w{3}\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d{1,2})\s+(\d\d):(\d\d):\d\d\s+(\d{4})/) { my ($mm, $dd, $HH, $MM, $yyyy) = ($1, $2, $3, $4, $5); $mm = $MONTH{$mm}; $dd = sprintf '%02d', $dd; my $date = $yyyy . $mm . $dd . $HH . $MM; print STDERR "... check date: $date ...\n"; if ($date ge $in_date) { print STDERR "... date found older than: $in_date ...\n"; ++$date_found; last; } } } unless ($date_found) { print "ORA- record not found\n"; exit; } # search ORA- my $ora_found = 0; while (<>) { if (/^ORA\-/) { print "ORA- record found!\n"; ++$ora_found; last; } } print "ORA- record not found\n" unless $ora_found; __END__

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.1

アラートログの書式はちょっといいかげんなので そのままでは実現困難とおもいます。 Solarisならばlogadmというコマンドがあるので 毎日アラートを別の(日付+ファイル名など)ファイルにきりだせば いいのでは?

すると、全ての回答が全文表示されます。

関連するQ&A