質問 > 管理機能 > ログローテーション処理について |
管理機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
patapata |
投稿日時: 2010/9/15 17:27
対応状況: −−−
|
仙人 登録日: 2010/7/7 居住地: 神奈川県 投稿: 502 |
ログローテーション処理について 環境:
EC-CUBE 2.4.4 OS Linux DBサーバ MySQL 5.0.77 WEBサーバ Apache PHP 5.1.6 Webブラウザ IE8 いつもお世話になっております。 現在ログローテーションが起きるタイミングにおいて、 Warningが発生しており原因を追いかけてみましたが、よくわからなかったので質問させて頂きました。 詳細: 関係ありそうな、設定は以下です。 MAX_LOG_QUANTITY = 5 MAX_LOG_SIZE = "1000000" site.logのファイル権限は、全て"666" Warning内容: GC_Utils.phpのgfLogRotation関数にてrenameに失敗。 Warning: rename(・・・/site.log.1) [function.rename]: そのようなファイルやディレクトリはありません またWarningだけなら特に気にしておりませんでしたが、上記Warningが発生した場合site.logファイルが消えてしまいます。 →例えば、site.log、site.log.1〜5までファイルが存在している状態でログローテーション処理が発生した場合、site.log.1やsite.log4のファイルがなくなってしまいます。 また、MAX_LOG_SIZE = "10000"に変えサイトトップで、何度かリロードを行い確認したところrename処理が何重にも走っているようです。これは想定された動作なのでしょうか? -----------------参考----------------------------------- function gfLogRotation($max_log, $max_size, $path) { // ファイルが最大サイズを超えていない場合、終了 if (filesize($path) <= $max_size) return; // アーカイブのインクリメント(削除を兼ねる) for ($i = $max_log; $i >= 2; $i--) { $path_old = "$path." . ($i - 1); $path_new = "$path.$i"; if (file_exists($path_old)) { rename($path_old, $path_new); } } // 現在ファイルのアーカイブ rename($path, "$path.1"); } |
AMUAMU |
投稿日時: 2010/9/15 18:14
対応状況: −−−
|
神 登録日: 2009/5/2 居住地: 東京都 投稿: 2712 |
Re: ログローテーション処理について 下記の不具合チケットと、修正内容を確認されると良いと思います。
http://svn.ec-cube.net/open_trac/ticket/746
|
patapata |
投稿日時: 2010/9/15 18:59
対応状況: −−−
|
仙人 登録日: 2010/7/7 居住地: 神奈川県 投稿: 502 |
Re: ログローテーション処理について 回答ありがとございます。
チケットを確認いたしましたが、正式版Var2.4.4では既に対応されており、差分はないようです。 (背景:赤が削除 背景:緑が追加ですよね) その上で、現象が発生しております。 gfLogRotation関数は、スレッドセーフにしなければならないような気がいたしますが・・・見当違いでしょうか? 追記: 現象確認方法と致しまして、 パラメータ設定で、MAX_LOG_SIZEを"1000"や"10000"等の小さい値に設定し、サイトのトップを何度かリロードする。 (パラメータ設定で、DEBUG_MODEをTrueに設定すれば画面にWarninngが出るのでわかりやすいかと・・・) |
AMUAMU |
投稿日時: 2010/9/15 21:10
対応状況: −−−
|
神 登録日: 2009/5/2 居住地: 東京都 投稿: 2712 |
Re: ログローテーション処理について あら、このチケットの修正内容と質問を私も勘違いしていました。申し訳ないです。
patapataさんの環境で、Warningが出る理由はいまいち分かりませんが、この修正内容は問題があると私も認識しました。 ・ご指摘の通りスレッドセーフでない ・私が気付いたのは、renameでのファイル上書きは環境・設定依存する。 もしかしたらpatapataさんについてはrename関数の依存によるものかもしれません。 当該チケットをリオープンしておきます。
|
seasoft |
投稿日時: 2010/9/15 23:34
対応状況: −−−
|
神 登録日: 2008/6/4 居住地: 投稿: 7367 |
Re: ログローテーション処理について 2.5 デベロッパー版ですが、11クライアント同時接続でテストしましたが再現しないですね・・・
環境依存が強そうです。 EC-CUBE 2.5.0-dev OS Linux (Fedora) DBサーバ PostgreSQL 8.3.7 WEBサーバ Apache/2.2.9 PHP 5.2.9 GD Loaded AMUAMU 様 > ・私が気付いたのは、renameでのファイル上書きは環境・設定依存する。 「設定」というのは、上記環境でも関与ありそうな部分はありますか?
|
patapata |
投稿日時: 2010/9/16 0:36
対応状況: −−−
|
仙人 登録日: 2010/7/7 居住地: 神奈川県 投稿: 502 |
Re: ログローテーション処理について チケット内容を見る限り、以前の処理とは大分動作が異なっていますよね。
例えば、MAX_LOG_QUANTITYを10→5に変えたり場合、過去のコードでは、ファイル数が5になりますが・・・今のコードでは、site.log.6からは無視されファイル数は10のままです。 また過去のコードでは最後にsite.logを作成しておりますが、今のコードでは次回ログ書き込み時までsite.logファイルは存在しないかと・・・ どこで作成しているのかまで、まだおっかけてはいませんが、 呼び出し順序次第で、現在のコードではsite.logが存在しない場合、最後のrenameで必ずWarningがでてしまうかと思われるのですが。 他にディレクトリの存在チェックなんかもとっぱらわれていますし う〜ん。チケットに記されている対応以外の処理も含まれてのことならわかりますが・・・ また明日時間をみて調べてみます。 |
seasoft |
投稿日時: 2010/9/16 1:52
対応状況: −−−
|
神 登録日: 2008/6/4 居住地: 投稿: 7367 |
Re: ログローテーション処理について > また過去のコードでは最後にsite.logを作成しておりますが、今のコードでは次回ログ書き込み時までsite.logファイルは存在しないかと・・・
> どこで作成しているのかまで、まだおっかけてはいませんが、 呼び出し順序次第で、現在のコードではsite.logが存在しない場合、最後のrenameで必ずWarningがでてしまうかと思われるのですが。 ファイルの生成は GC_Utils の中で、"a+" で fopen している部分になると思います。 その後で、ログローテーションしているので、同時処理が1本では発現しないと推測しています。 そうなると、実際にマルチスレッドといった観点で発生している状況かもしれませんね。 また、fopen や fwrite ではエラーを検出していませんので、その辺りでコケることがあると、rename の段階で警告が発生という流れも考えられそうです。 ちなみに、patapata 様がお試しになっている環境では、実際に PHP はマルチスレッドで動作していますか? 前述の当方テスト環境は、非マルチスレッドとなっています。
|
AMUAMU |
投稿日時: 2010/9/16 2:23
対応状況: −−−
|
神 登録日: 2009/5/2 居住地: 東京都 投稿: 2712 |
Re: ログローテーション処理について >> ・私が気付いたのは、renameでのファイル上書きは環境・設定依存する。
> >「設定」というのは、上記環境でも関与ありそうな部分はありますか? patapataさんの環境に関する情報だけでは不明ですが、私が知っているrename関数の環境依存、設定依存は ・Windows上のPHPではrenameで既にファイルが存在する場合は、ファイル上書きをしない挙動だったと記憶しています(以前はまったことが・・・)。環境依存、たぶん一番問題。 ・suPHP下では、既にファイルが存在する場合rename関数での上書きをしなかった記憶があり、環境・設定依存の可能性あり。 ・サポート外かと思いますがキャッシュ高速化系(eAccelarator等)では上書きの挙動が変わったような気がします。 また、スレッドセーフで無い問題はCGIモードでPHPが動いていると発生しやすいかと。
|
seasoft |
投稿日時: 2010/9/16 3:06
対応状況: −−−
|
神 登録日: 2008/6/4 居住地: 投稿: 7367 |
Re: ログローテーション処理について patapata 様の冒頭の環境情報からしますと、(今回は)1点目は排除できそうですので、「suPHP」と「高速化モジュール」と「CGI」といった辺りが気になるところですね。
> また、スレッドセーフで無い問題はCGIモードでPHPが動いていると発生しやすいかと。 スレッドセーフと聞いて MPM Worker での運用あたりを推測していましたが、なるほど、CGI ですか。CGI でマルチスレッドとは思いつきませんでした。 しかし、EC-CUBE でスレッドセーフで無い処理に心当たりがいくつか・・・ マルチプロセスは意識があっても、スレッドまでは意識していないのが現状です。
|
AMUAMU |
投稿日時: 2010/9/16 3:18
対応状況: −−−
|
神 登録日: 2009/5/2 居住地: 東京都 投稿: 2712 |
Re: ログローテーション処理について >しかし、EC-CUBE でスレッドセーフで無い処理に心当たりがいくつか・・・
いくつかありそうですが使用頻度との兼ね合いでしょうかね? なかなか難しい所です。 >マルチプロセスは意識があっても、スレッドまでは意識していないのが現状です。 DB周りのロック処理なども含めて、ここらへんを中心にスケーリングした利用方法に対応させるのは中々大変なので優先順位は正直低いかもしれませんね・・・ (環境依存させれば比較的楽で、よくカスタマイズしていますが、幅広く動かすとは正反対の使い方でフィードバックがなかなか難しい・・・
|
(1) 2 3 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |