• 締切済み

File::Tailでファイル名変更に追従するには

 あるログファイルをリアルタイムにトレースして流量を測る ツールを作ろうとしています。  mailstats.plを参考にいろいろと試しているのですが、監視 しようとしているログが日付つきのファイル名で作られていて 日次でファイル名が変わってしまうのです。  File::Tailはデフォルトだとdieしてしまいますが、errmode でハンドラを試してみたり、name_changesを試してみたり していますがうまくいきません。  ログをはいているプロセスに、ファイル名が変わるタイミン グで何かをキックしてもらうか、とも考えたのですがあまりス マートではないような気がしています。  良い方法はあるでしょうか。詳しい方教えてください。  よろしくお願いいたします。  以下errmode,name_changes等を試す前のスクリプトです。 === #!/usr/bin/perl use File::Tail ; $debug = 0; $mail_log = './log' ; my $logref=tie(*LOG,"File::Tail",(name=>$mail_log,debug=>$debug)); while (<LOG>) { print; } ; ===  ファイルがmvされると、 Error opening ./log: No such file or directory at ./tail.pl line xx  となります。  このエラーをフックして、再オープンできれば良いのですが。。

  • Perl
  • 回答数1
  • ありがとう数6

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

ignore_nonexistant は試されましたか ?

参考URL:
http://search.cpan.org/~mgrabnar/File-Tail-0.99.3/Tail.pm
tsmrxx
質問者

お礼

コメント、ありがとうございます。 結果、うまくうごきました。 いろいろ試してよくわからなくなってきていますが。。 なぜか、こう書くと、最初のオープン時にエラーになります。 === $mail_log = './log' ; $logref=tie(*LOG,"File::Tail",(name=>$mail_log,maxinterval=>5,name_changes=>\&change,debug=>$debug)); =↑こうすると =↓こうなる Error opening ./log: No such file or directory at ./tail.pl line 18 === ./logはあるのに、です。 ご教示いただいたとおり、 ignore_nonexistant=>1 を追加したら出なくなりました。 これで先に進めそうですが、、 なんで./logがあるのに、No such file or directoryと言われるのか 気持ち悪い感じです。 Tail.pmを読んでみます。 ありがとうございました。

関連するQ&A

  • ログファイルに余計なスペース

    以前も同じような質問をして回答をいただいたのですが、 ちょっと状況がかわったので再度質問させていただきます。 以前は print FILE"@log"; とするとスペースが入る、としたところ print FILE @log; とすればOKという回答をいただき、解決していたんですが、 今回は print FILE"$ID<>$COUNT<>$TITLE<>$NAME<>$PASSWORD<>$COLOR<>$NAKAMI<>$TIME<>$SEARCHKEY\n@log_file"; としたいのです。 やはり半角スペースが行頭に入ってしまいます。 これを回避するにはどうしたらいいですか?

  • ReadParseを使ってのバイナリファイルのアップロード

    ファイルをアップロードするCGIを作ろうと思い、以下のように書いてみました。そうしたところテキストファイルのアップロードには成功しましたが、バイナリファイルだとアップロード出来ても開けなかったり、画像が崩れてしまったりしてしまいました。 何故バイナリファイルだとアップロードが失敗してしまうのかわかりません。どこを直せば良いのでしょうか。 よろしくお願いします。 ----------------------------------------------- フォーム <FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="xxx.pl"> <INPUT TYPE="file" NAME="file"> <INPUT TYPE="submit" VALUE="アップロード"> </FORM> ------------------------------------------------ xxx.pl &ReadParse(*in, *f_name, *f_type); $f_name{'file'}=~/([^\\\/]+)$/; $filename = $1; open(IN, ">$filename"); print IN $in{'file'}; close(IN);

    • ベストアンサー
    • CGI
  • Perlでのファイル入出力、処理方法

    メモ帳で以下のようなプログラムを書きました。(file_1.plで保存しました) #!/usr/bin/perl $file="data.csv"; $cityfile="name.txt"; $outfile="data_out.csv"; open (IN, $file) or die "$!"; open (FILE, $file) or die "$!"; open (OUT, ">$outfile") or die "$!"; @city = <FILE>; ・ ・ ・ これをCygwinコマンド上で、 perl file_1.pl と入力し、Enterを押すと「No such file or directory at file_1.pl line 9.」と表示されます。 line9はopen (FILE, $file) or die "$!";という文です。 どこが間違えで、どのように修正すればよいのでしょうか。 よろしくお願いします。

  • php file() で外部サーバのファイルを読もうとするとWarni

    php file() で外部サーバのファイルを読もうとするとWarning: file(http://xyz.・・・エラーとなる。 いつもお世話になります。 phpで $csvscj='http://xyz.・・・';  //参照テキストファイル名 $FielList = implode('', file($csvscj,FILE_SKIP_EMPTY_LINES)); とすると、 Warning: file(http://xyz.・・・ というエラーが発生するようになりました。 file()で読み込むファイルがローカルPCの内部だとこのようなエラーは発生しません。 phpは、xampを個人のPCへインストールして使用しています。 この、phpのスクリプトをホームページを公開しているサーバーへアップして実行するとエラーは発生しません。 また、xampがインストールしてある別のPCでこのスクリプトを実行してもエラーは発生しません。 つまり、ある特定の機種のみで外部ファイルを読み込もうとするとエラーが発生するようになってしまいました。 「なってしまいました。」というのは今までこのようなことはありませんでした。 エラーが出るようになった機種を1ヶ月程使わないでいたらエラーが出るようになりました。 このエラーが出るようになったPCのどこが変わったのかわかりません。 解決の糸口となるようなことでも構いません。 おわかりになる方みえましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • UTL_FILE_DIRについて

    お世話になっております。 PL/SQLのファイル出力を行おうとUTL_FILE_DIRを組んだのですがファイルが更新されません。 エラーも検出されないのでどうしたものかと悩んでおります。 ソースは一番最後に記載します。 現状のやった作業に関しては ・初期化パラメータにUTL_FILE_DIR = * selectで確認済み ・テキストファイルの確認  ソースに記載してる通りの所に存在している。(権限もフルコン) oracleのバージョンは9iです。 よろしくお願いします。 set serveroutput on; DECLARE -- ファイルハンドラ vHandle UTL_FILE.FILE_TYPE;   vDirname      VARCHAR2(250);   vFilename      VARCHAR2(250); vOutput VARCHAR2(32767); error_code       NUMBER(5); error_message VARCHAR2(2048); BEGIN vDirname := 'c:'; vFilename := 'test.txt'; vHandle := UTL_FILE.FOPEN(vDirname, vFilename, 'w'); vOutput := ファイル出力です'; UTL_FILE.PUT_LINE(vHandle, vOutput); UTL_FILE.FCLOSE(vHandle); EXCEPTION WHEN OTHERS THEN error_code := sqlcode; error_message := sqlerrm; dbms_output.put_line('エラーコード:' || error_code); dbms_output.put_line('エラーメッセージ:' || error_message); END; / 上記実行するとエラー無しで正常終了しますがテキストファイルは更新されていません。

  • シェルでftp接続によるファイル取得について

    以下のようなシェルスクリプトを作成しましたが、 (file-name) get: No such file or directory (file-name) done: No such file or directory のエラーメッセージが出てしまい、うまくいきません。 OSはLinux(FedoraCore4)です。 どうやらファイル名の取得がうまくいかず、エラーになっている 様です。 試しに直接ファイル名を指定して書くと、無事ファイルを 取得できます。 エラーの原因がお分かりになる方、どうぞ宜しくお願い致します。 ----------------------------------------------- #!/bin/sh cd /local_test/log/ ftp -n xxx.xxx.xxx.xxx<< _EOF user test_user test_pass cd /test/log/ ascii prompt for i in *.log do chmod u+r $i get $i chmod u-r $i done bye _EOF exit 0 -----------------------------------------------

  • 【C#】作成したファイルに書き込みしたい

    開発環境はMicrosoft VisualC#2008です。 C#初心者です。よろしくお願いします。 現在、Form1とUserControl1を組み合わせてパズルゲームを作成中です。 Form1でボタンをクリックすると、クリックした日時を取得して、その日時をファイル名とするテキストファイルを作成することは出来ました。(例:20100115154717.txt) 今度は、そのファイルをUserControl1で開いて、書き込みをしていきたいのですが、エラーが出てしまい、この作成したファイルに書き込むことが出来ない状況です。 ※ちなみに、別のファイル(log_sample.txt)を指定したら書き込みは出来ました。 アドバイスよろしくお願いします。 <Form1.cs>一部抜粋 public string File_name { get { return this.file_name; } set { this.file_name = value; } } private void select_button_Click(object sender, EventArgs e) { //開いた時刻をファイル名に指定 DateTime dt = DateTime.Now; file_name = dt.ToString("yyyyMMddHHmmss"); //ログファイル作成・データ追加 StreamWriter sw = new StreamWriter(new FileStream"C:\\Documents and Settings\\My Documents\\log\\" + file_name + ".txt", FileMode.CreateNew)); } <UserControl1.cs>一部抜粋 //候補選択 private void label1_Click(object sender, EventArgs e) { Form1 f1 = this.Controls["Form1"] as Form1; DateTime dt = DateTime.Now; //ログ書き込み(日付、場所(ユーザーコントロール、ラベル名)、クリック(1)orダブルクリック(2)) StreamWriter sw = new StreamWriter(new FileStream("C:\\Documents and Settings\\My Documents\\log\\"+ f1.File_name +".txt", FileMode.Append)); sw.Write(dt.ToString()+","); sw.Write(this.Name +","); sw.Write("label1,"); sw.WriteLine("1"); sw.Close(); }

  • バイナリファイルのアップロード

    とあるサイトのマルチパートリクエストの使用事例をそのまま使って153KB程度のGIFファイルをアップロード実験してみましたら、処理後ブラウザで「cgi-lib.pl: Request to receive too much data: 153345 bytes 」と表示されアップロードされません。表示の意味と、どうすればアップロードできるかを教えてください。 ● サンプルHTML <html> <head><title>ファイルアップロード</title></head> <body> <form method="POST" action="upload.cgi" enctype="multipart/form-data"> <input type="file" name="upload"> <input type="submit" value="送信"> </form> </body></html> ● サンプルCGI require "cgi-lib.pl"; &ReadParse; $upload = $in{"upload"}; # ファイル内容を取得 $name = $incfn{"upload"}; # ファイル名を取得 $name =~ s/\\/\//g; # パス区切り文字を/に変換 $name = substr($name,rindex($name,"/")+1); # ファイル名のみを取得 if($upload ne "" && $name ne ""){ open(FILE,">$name"); binmode(FILE); print FILE $upload; close(FILE); }

    • ベストアンサー
    • Perl
  • Fileクラス

    いろいろ調べてみたんですがよくわからないので教えてください。 File d = new File("."); String[] f= d.list(); のようにして”・”カレントディレクトリの ファイル名が取得できます。f[]の配列の中身がファイル名になります。 そこで、カレントディレクトリの、ある特定の拡張子のものだけ取り出せないかと、 File d = new File(".\\*.java"); (ここでは.javaのもの) としたのですが、 java.lang.NullPointerException のエラーがでてしまいます。 どのようにしたら、 *.java のような特定の拡張子のファイル取得が出来ますでしょうか。

    • ベストアンサー
    • Java
  • 「***.txt」 から 「***.pl」 への変更は?

    こんにちは。 アクセス解析CGIの導入に挑戦しようと思ってます。 マニュアルに 「***_pl.txt をダウンロードしてファイル名を ***.pl に変更する」 とあるのですが、txtファイルからplファイルへ変更するのは どのようにしたらいいのでしょうか。 ファイル名を変更するだけじゃないですよね・・・? あと、必要ファイルとして  ***.pl … アクセスログ取得スクリプト  ***.txt … アクセスログ と書いてあります。 配布されているのは「***_pl.txt」というファイルだけで、 「***.txt」というファイルは無いようなんですが、 自分で「***.txt」というファイルを作ればいいのでしょうか・・・? ”***”には全て同じ名前が入ってます。 入手先にサポートBBSなどがないので、こちらで教えていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう