WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perlのSTDERRをパイプで別コマンドに渡す方法。

0:[投稿] ecc [2005/10/10 13:16 ] [環境:ie6 perl5.8 linux]

perlを-wで動かした場合などに STDERR に出される警告ですが、これを別のコマンドにパイプで渡すことは可能でしょうか?

mod_perlで動かしているのですが、error_logに出される警告文にさらに情報を付与して出力したいと考えています。


1:[回答] B-Cus [2005/10/10 14:11 ]

% cat hoge.pl
BEGIN {
 open(STDERR, "| cat -n");
}
use warnings;
print $not_initialized_variable;

% perl hoge.pl
1      Name "main::not_initialized_variable" used only once: possible typo at a line 5.
2  Use of uninitialized value in print at a line 5.

とか。

まぁ、ちゃんとしたソースをかけば警告なぞ出ないわけで、
警告というものの使い方を誤っているような気もしますが。


2:[回答] ecc [2005/10/11 16:51 ]

ありがとうございます。
ほとんど警告は出ないのですが、まれに吐き出されるのです。

error_logのログはipも出ないですし、タイムスタンプもミリ秒
が出ないので、どこからどうアクセスされた場合に警告が出るの
かが分からないのです。

でもよく考えればパイプで繋いだとしても、どのIPからのアクセスか
分からないですね。

アクセスが多いので、STDERRに出力された時点でのクライアントIPと時間と$ENV{REQUEST_URI}が分かればなにが原因かが特定できるのですが。


3:[回答] B-Cus [2005/10/11 17:17 ]

>>2
> error_logのログはipも出ないですし、タイムスタンプもミリ秒が出ないので
それは apache (を使っているかどうかはわかりませんが) のログの設定次第です。

調査目的であれば、わざわざ情報をとりづらい別プロセスにするよりは、
 $SIG{__WARN__} = sub {
   my ($warn) = @_;
   open(WARNLOG, ">>/tmp/warn.log");
   print WARNLOG scalar(localtime)." $warn\n";
   foreach (sort keys %ENV){
     print WARNLOG "\$ENV{$_}=[$ENV[$_]\n";
   }
   print WARNLOG "----stdin begin-----\n";
   print WARNLOG "$あらかじめ保存しておいた標準入力\n";
   print WARNLOG "----stdin end-----\n";
   close(WARNLOG);
 }
などとする方がよいかもしれません。


4:[回答] B-Cus [2005/10/11 17:21 ]

最後のセミコロン付け忘れ。

- }
+ };


5:[完了] ecc [2005/10/11 17:34 ]

ありがとうございます。

完璧です^^。まさにこれがやりたかった事です。

$SIG{__WARN__} なんてものがあるのですね。
私が持っている本には全く出てきてない(>_<)

これで警告の元を突き止める事ができます。ありがとうございました。

回答(必須): 状態:

お名前(必須):

URL:




[戻る]