• ベストアンサー

ループ内でsyslog出力

いつもお世話になっております。 標題についてご教授願えないでしょうか。 今までfwrite等でファイルに出力していた内容を SYSLOGにて出力する事となりました。 その際、これまでfor(i=0; ・・・)等のループ内で ファイル出力して、ループを抜けたらfclose()としていた処理で、 同様の処理が出来るが教えて頂きたいです。 纏めと、ループ内のfwriteをsyslogに変更 openlogとcloselogはループ外

  • prr4e
  • お礼率48% (66/136)
  • PHP
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

ん~? 仕様を決めないことにはどうしようもないでしょう 複数のメッセージをまとめて出したいなら$messageをつなげてから処理すればいいし 一行ごとにヘッダ情報をつけたいならループすればいいし・・・ <?PHP openlog("myLog", LOG_PID | LOG_PERROR, LOG_LOCAL0); $access = date("Y/m/d H:i:s"); $message="test1"; syslog(LOG_INFO, "$message: $access {$_SERVER['REMOTE_ADDR']} ({$_SERVER['HTTP_USER_AGENT']})"); $message="test2"; syslog(LOG_INFO, "$message: $access {$_SERVER['REMOTE_ADDR']} ({$_SERVER['HTTP_USER_AGENT']})"); closelog(); ?> としてもいいし <?PHP openlog("myLog", LOG_PID | LOG_PERROR, LOG_LOCAL0); $access = date("Y/m/d H:i:s"); $message="test3\ntest4"; syslog(LOG_INFO, "$message: $access {$_SERVER['REMOTE_ADDR']} ({$_SERVER['HTTP_USER_AGENT']})"); closelog(); ?> でもいいということ 前者をループで処理するならopenlogとcloselogでループをはさめばいいし 後者ならopenlogとcloselogでループをはさんでもはさまなくても 出力するときに処理すればいいでしょう

prr4e
質問者

お礼

ありがとうございました。 複数のファイルに出す場合は、 吐き出す内容を溜めていっぺんに出すようにしようと思います。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

あ、ごめんなさい CLIモードではなくPHPからsyslogを呼ぶんですね $messageはループで連結したデータを流すことになるでしょう $message=""; for($i=0;$i<$len;$i++){ if($message!=="") $message.="\n"; $message+='・・・'; } openlog("myLog", LOG_PID | LOG_PERROR, LOG_LOCAL0); $access = date("Y/m/d H:i:s"); syslog(LOG_NOTICE, "$message: $access {$_SERVER['REMOTE_ADDR']} ({$_SERVER['HTTP_USER_AGENT']})"); closelog(); みたいな感じ?

prr4e
質問者

お礼

有難う御座います。 syslog自体よく分かっていないのですが、 ループ内で何度もopenlogとcloselogをするとメモリなど問題あるのでしょうか。 既存の処理でループ内で2つのファイルに書き出している場合、 closelogが引数を持っていないため、 何度もやらないといけない認識なんですが。 間違っていないでしょうか

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

syslogを使うならloggerでメッセージを出力することになります (1)syslog.confに適切なタグを設定しておき (2)logger -t hoge $MESS で出力します

prr4e
質問者

補足

回答有難う御座います。 よく分かっていなくてすみません。 上記は確認方法と言う事でしょうか。

関連するQ&A

  • 再度 PHPのSYSLOG出力方法

    いつもお世話になっています。 昨日PHPでSYSLOGの出力方法について質問させて頂いたものです。 (1)ループ外でopenlog,closelog、ループ内でsyslogする (2)ループ内でopenlog,syslog,closelogをやる ひとつの処理で複数ファイルに出力する場合、 (2)の方法でいっぺんにまとめて出そうと思い、 openlog("goo_gn_syslogtest" ,LOG_CONS | LOG_NDELAY, LOG_LOCAL5); syslog(LOG_INFO, "test\ntest2"); closelog(); と$messageに改行コードを入れると、ログ内に test#012test2 と書かれていました。 設定で、$messageの後は改行がされる事になっています。 一行一行出力するsyslogに対してはまとめて出力する事は不可能なのでしょうか。 宜しくお願い致します。

    • 締切済み
    • PHP
  • Sys::Syslogモジュールでsyslogを出力したい

    以下の様なスクリプトでsyslogを出力したいのですが、出力することができません。どなたかご教授ください。 環境は vine2.6r4 perl5.6.1 で、/etc/syslog.confにlocal4.* /var/log/hoge.logを追加後、syslogdを再起動しました。 プログラムを実行するとhoge.logファイルは出力されます。 また、logger -p local4.err messageでhoge.logにmessageが出力されることも確認済みです。 ------------- #!/usr/bin/perl -w use strict; use Sys::Syslog qw(:DEFAULT setlogsock); # 実行ファイル名の取得 my ($prog_name) = $0; $prog_name =~ s/(.*)\/(.*)/$2/; # Sys::Syslogモジュールの引数 my($ident, $logopt, $facility); my($ident) = $prog_name; my($logopt) = 'ndelay'; my($facility) = 'local4'; # 処理開始 &put_syslog("info", "process start."); sub put_syslog { my($priority, $msg) = @_; openlog($ident, $logopt, $facility) || die "put_syslog: can't open syslog\n"; syslog($priority, $msg); closelog(); }

    • ベストアンサー
    • Perl
  • syslogで出力されるパス

    今syslogで出力されるパスを変更したいのですが、どうやるのか全く不明です。 現在、デフォルトのerror_logのパスは/var/log/abc.logなのですが、 一部の処理で、syslogで/var/log/abc/abc.logに出力をしています。 それに倣おうと思うのですが、どうやって/var/log/abc/abc.logに 出力しているのか全然分かりません。 syslogを使う時にパス指定など出来るのでしょうか? またはどこかでini_set()しているという事になるのでしょうか?

    • ベストアンサー
    • PHP
  • Perlからsyslog経由でログを出力したい

    皆さん、こんにちは。 Perlからsyslog経由でログを出力しようと考えています。 2点質問がありますのでご存知でしたらご教授ください。 (1)Perlスクリプトからsyslog経由でログ出力する方法 いろいろ方法は考えられるかと思いますが、 よく使われるエレガントな方法をご教授していただけるとありがたいです。 通常はやはりloggerを使うのでしょうか? (2)syslog経由で任意のファイルに出力する方法 syslogで、あるプログラムからのログにおいて、 このレベルはこのファイルという分け方はできますか? できなければ別の手段はありませんか? syslog-ngであればこのようなことができるのでしょうか? もしできれば方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • syslogでログファイルの出力方法

    現在、syslogを利用してログファイルを出力しようと思っています。 syslogというサービスを利用する事を教えて頂き、syslog.confを書き換えて Linux上でsyslogのサービスは起動しており、ファイルが自動的に作成されました。 (パーミッションが600なので644にしたいのですが、ひとまず置いておき、 手動でテスト的に777に変更しました) しかし、syslogのサービスが正常に動作しているかの確認は出来ておりません。 それでいてPHPからログが出力されるようにするコーディングが分かりません。 別環境の他のスクリプトで既に実績があるのですが、書き方が違う分、ダメなのかもしれません。 初めて使うので、定数が実際に何を意味しているのかがPHPのマニュアルを見ても意味不明です。 宜しければPHPを介在しない、syslogが正常に動作してログを出力してくれるLinuxのコマンドと、 PHPでのsyslogの書き方をご教示下さい。 現在、スクリプトはこんな感じです。 A.php $abc = LOG_LOCAL5; //実際はメソッドの引数(参照渡し) //↓実際は別クラスのメソッド $log = "test"; define_syslog_variables(); openlog('log', LOG_PID | LOG_PERROR, $abc); syslog(LOG_NOTICE, $log); closelog();

    • 締切済み
    • PHP
  • ファイル出力時のエラーについて

    wileのループの途中で、バイナリのファイルを出力しているのですが、しばらくはファイルを出力してくれるものの、毎回決まった回数 ループが回ると、セグメンテーションエラーで止まってしまいます。 症状としては、以下のようなプログラムを実行すると、しばらくは問題なく処理されるのですが、ループの途中で、 aaaaa"の表示の後、"OPEN FAILED"の表示はないまま、 "bbbbb"が表示されるまえに、エラーで止まってしまいます。 原因がよくわかりません。どなたか、原因が推測できる方が おられましたら教えてください。 よろしくお願いします。 (OSはwindowsXP,コンパイラはgccを使用しております。) while(i<100){ i++; data[i] = i; sprintf(file,"file_%d",i); printf("aaaaa\n"); if((fp=fopen(file,"wb")) == NULL) { printf("OPEN FAILED %s\n", file); exit(0); } printf("bbbbb\n"); fwrite(data, sizeof(short), 100, fp); printf("ccccc\n"); fclose(fp); }

  • syslog-ngのdestination fileについて

    お世話になります。この度、御教授いただきたく書き込みさせていただきました。何卒宜しく御願いいたします。 ◆環境 ・CentOS(4.4)でsyslog-ng(1.6)を動作。 ・とある機器からsyslogを受信。 ◆症状 対象機器からのsyslog(514)を受け設定ファイルに指定しているdestination fileに保存は出来るのですが、書き込まれる際にファイルの権限が変更されてしまいます。 具体的には 1.destination file=taisho.log(644) ※taisho.log(644)ファイルはroot権限で作成。 2.対象機器からログを受信、syslog-ngによりtaisho.logファイルにログが書き込まれる。 3.書き込み成功。ただしファイル権限がtaisho.log(600)に変更。 上記症状はsyslog-ngのサービスを再起動するたびに起こります。 ※chmod 644 taisho.log で元に戻した場合、syslog-ngを再起動しない限り権限は"644"のままです。 お忙しいと思いますが、ご教授のほど宜しく御願いいたします。

  • ループ文出力から バイナリファイルの作成方法

    for文でまわして求められた値をバイナリファイルに落としたく、下記のようなプログラムを書いたのですがうまくいきません。fwriteをretfunc中で行えばうまくいくと思うのですが、retfuncは実際は複雑なので、下位関数で計算だけを行い、mainでは戻り値を随時バイナリファイルに書き込むだけの処理にしたいです。 質問(1) 下記プログラムだとfor文がまわりません。勝手にループして欲しいだけなので引数はなくvoidとしてみましたが問題ないでしょうか? 質問(2)どうしたらループするでしょうか? 質問(3)fwriteの使い方はあってますか?サイズは1バイトで一個ずつの書き込みです。 ※参考書を元にやっているため体系的に理解してないことも多いです。 ご教授よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int retfunc (void) { int acnt,bcnt; int srout; for ( bcnt=0; bcnt<10; bcnt++) { for ( acnt=0; acnt<10; acnt++) srout=いろいろな処理; return srout ; } } main (int argc, char *argv[]) { int srout; FILE *FPo; FPo = fopen("out.bmp","wb"); if ( FPo == NULL ) { puts("Can't open out.bmp!"); return 1; } srout =retfunc(); fwite(&srout,1,1,fpo); }

  • ファイルに書き込む時の負荷について

    PHPバージョン5.2.4を使っています。 次のような // ------------------------------------ $fp = fopen("data.txt", "w"); $buf = ""; for ($i = 1; $i <= 3; $i++) { $buf .= "aaa$i\n"; } fwrite($fp, $buf); fclose($fp); // ------------------------------------ という変数にいったん保存してから書き込む場合と // ------------------------------------ $fp = fopen("data.txt", "w"); for ($i = 1; $i <= 3; $i++) { $buf = "aaa$i\n"; fwrite($fp, $buf); } fclose($fp); // ------------------------------------ というその都度ファイルに書き込む場合とでは どちらが良い悪いというのはあるのでしょうか? たとえばこちらのやり方は負荷がかかるなど ループが多くなっていった場合に違いがでてくるのでしょうか?

    • ベストアンサー
    • PHP
  • syslogのローテーション設定

    FreeBSD上でsyslogのローテーションを設定しています。 ローテーションは毎日午前0時に行い、それが正常に ログファイルのファイル名を syslog.log.2006-06-11.gz (つまりsyslog.log.(ログローテーションを実行した前日の日付)) のように運用したいと思っています。 何かアイデアがありましたらお教えください。 今のところ、ローテーションにはnewsyslogを使用しています。 ローテーション自体は問題なく動作していますが、ファイル名の 変更処理がわかりません。 また自分は当該サーバの管理者ですので、やれることに 権限上の制限はありません。 よろしくお願いいたします。

専門家に質問してみよう