2007年11月22日木曜日

Zend_Logで行く3

[Zend_Logで行く3]
Zend_Logの続き。
1でやろうと思ってたプライオリティ毎のメソッド。もちろん、既存のlogメソッドもOK。
あっさり考えるえだけならちょろいか。
Zend_Loader::loadClass('Zend_Log');
class BaseLog extends Zend_Log{
    public function log($message, $priority){
        //独自の実装
        parent::log($message, $priority);
    }

    public function debug($message){
        //独自の実装
        $this->log($message,Zend_Log::DEBUG);
    }

    public function info($message){
        //独自の実装
        $this->log($message,Zend_Log::INFO);
    }
    ・
    ・
    ・
    public function emergency($message){
        //独自の実装
        $this->log($message,Zend_Log::EMERG);
    }

}
使う場合はZend_Logのlogの代わりに以下を実行で。
$logger = new BaseLog();
    ・
    ・
    ・
$logger->debug('debug message');
$logger->info('Informational message');
$logger->notice('notice message');
$logger->warn('warning message');
$logger->error('error message');
$logger->emergency('emergency message');
あとログを取る時にファイル名、行が欲しいと思ったりしたら以下
を追記
$tmpDbBckTrc = debug_backtrace();
$preFileInfo = $tmpDbBckTrc[0];
$this->setEventItem('file',basename($preFileInfo['file']));
$this->setEventItem('line',$preFileInfo['line']);
もちろんformatに%file%、%line%が入っているの前提。
重くなりそうなので、デバッグあたりに突っ込むか。いや、
使わないほうが良いのかな。。。
今日の日付は2008/5/20
プライオリティ毎のメソッドを用意しようと思ったら。
実はすでにZend_Logはフォローしてあったのね(^^;
最近になって気付いた、、、恥ずかしいorz
素の状態で$logger->debug()とかできちゃいました。

2007年11月20日火曜日

Zend_Logで行く2

1の続き。
[1]で分けたファイルそれぞれのログ形式を変えようかと思う。
Zend_Logは何もしないと
'%timestamp% %priorityName% (%priority%): %message%' . PHP_EOL
が出力されます。
フォーマットで%XXXXXX%(%で囲まれた箇所)は置換文字列としてWriterが扱うらしく、
timestampの値はデフォルトで出力した時間を置換してくれる。
でも、そのうち日付の形式も選べないといけんね。
priorityName,priority,messageはlog()の引数から取ってきてくれます。

ログの出力する項目を増やせるらしく、書き方としては
Zendのドキュメントにあるような感じ。
pidじゃなくてhost名とちょっと変えてみましたが以下でしょう。
$logger = new Zend_Log();
$logger->setEventItem('host',$_SERVER['HTTP_HOST']);
$logger->log('debug message',Zend_Log::DEBUG);
使うタイミングとしてはlogを実行する直前に使わないと欲しい値が取れなかったり
しますね。例えば実行したファイル名が欲しい場合にZend_Loggerを初期化したところ
でsetEventItemを実行するとどこで実行しても初期化した時のファイル名が入ってしまう。
ファイル名を残したい時ってそんなんじゃないよね。これも考えないと、、、
どこのフレームワークもきっとそうだろうけど、考えること多いな(^^;


長々と書いちゃいましたが、フォーマット変えるなら以下ですんじゃいます。
フォーマットはwriterに持たせられるのが良い感じ。
$debugWriter = new Zend_log_Writer_Stream('./debug.log');
$debugFormat = '%timestamp% %priorityName% (%priority%)'.PHP_EOL;
$debugFormatter = new Zend_Log_Formatter_Simple($debugFormat);

$infoWriter = new Zend_log_Writer_Stream('./info.log');
$infoFormat = '%timestamp% %priorityName% (%priority%): %message%'.PHP_EOL;
$infoFormatter = new Zend_Log_Formatter_Simple($infoFormat);

$errorWriter = new Zend_log_Writer_Stream('./error.log');
$errorFormat = '%timestamp% %host% %priorityName% (%priority%): %message%'.PHP_EOL;
$errorFormatter = new Zend_Log_Formatter_Simple($errorFormat);
あとはlogにwriterを突っ込むだけ。これだけなら簡単ね

2007年11月14日水曜日

child process exited with status 255

以下の環境で何故かブラウザからリクエストを投げると、Windows
がアラートを出してApache再起動とかしてくれる。
いや、困るんだけど、、、

Windows Vista
Apache 2.2.4
PHP 5.2.4
Zend Framework 1.0.1

Zend Frameworkを使わずにphpを実行すると何も無かったように
phpが実行される。なぜ?!
Zend Frameworkが使う予定なので、これは解消しないと
いけんね。


とりあえずapacheのエラーログ
Parent: child process exited with status 255 -- Restarting
とかいう行を発見しました。そんなん言われても聞いたこと
無いよ。

vistaが再起動してくれたと言う事はイベントログに何か残って
るっしょ。
[スタート]->[コントロールパネル]->[システムとメンテナンス]
->[管理ツール:イベントログの表示]->[Windows]->[アプリケーション]を参照。
赤丸×印のログを発見。
----------------------------------------------
障害が発生しているアプリケーション httpd.exe、
バージョン 2.2.4.0、
タイム スタンプ 0x45a476e3、
障害が発生しているモジュール php_operator.dll、
バージョン 5.2.4.4、
----------------------------------------------
組み合わせが悪いのかな?

※イベントログ探すのに30分かかった、、、

って事でとりあえずPHPのバージョンを変えてみた。
変更後は5.2.5。
とりあえず該当のエラーは出なくなりちゃんとレスポンス
まで帰ってくる。
とりあえずよし







2007年11月10日土曜日

鬼平犯科帳

とうとう、、、とうとう鬼平全巻揃えてしまった(笑

古本屋でかき集め、飛び飛びで読んでたけれども、
これで纏め読みができるw

人間臭い登場人物ばかりで、いやいや面白いw
人の道踏み外したらいけんな~と思えます。



2007年11月9日金曜日

[Zend_Logで行く1]

Zend frameworkの研究をしようと思い、ちょろちょろと触ってみました。
プライオリティで考えるとMVCモデル部分、DB、Log、Exceptionが優先度高いかなーと。
どっからおさえようかと思いMVCのとこを触ったんだけど、まだ掴めきれてない。
というかZendデフォルト機能を周到しつつSmartyを入れようとしたらあんましキレイ
にならない。。。サンプルをスコーンと入れても、実際に開発するとデフォルトView
を殺しつつ、自分でrender()とか書かないといけない。しかもデフォルトのViewを殺して
しまうのでhelper、filterが死んでしまう。勿体無い。なのでちょっとおあずけ。

はじめはLogからいきましょう。DBと違って環境も要らんしねw

Zend_Logを見てみましたが、ドフォルトでも良い感じ。
ちょっと拡張すれば、十分に運用できるんじゃまいか!?
DBに突っ込む事もしてくれるけど、最初はシンプルにファイル書き出し。

基本的には以下を組み合わせてって事かな。
Zend_Log.......................ログクラス
Zend_Log_Writer_Abstract.......実際にファイル書き込みや、書き込みログ生成
Zend_Log_Formatter_Interface...ログの形式を定義。Writerに追加。
Zend_Log_Filter_Interface................保存するログのフィルター。Writer、Logに設定可能

Logでまずやりたいのが
1.デバッグ、運用、エラーとログレベルでファイルを分ける。
2.[1]で分けたファイルそれぞれのログ形式を変える。

追加してやりたいのが、
3.logメソッドをラップしてログレベル毎にメソッド用意(DEBUGならdebug()な感じ)
4.メッセージIDをLogに渡して、事前に作成したメッセージデータからメッセージ取得

[3]は好みw 難しくないけどね~。
[4]はソースコードにメッセージベタ書きになるのが嫌なはず。

まずは[1]からログの形式Formatterを作成、Filterで
Writerのインスタンスを3つ生成。WriterはZend_log_Writer_Streamを使用。
$debugWriter = new Zend_log_Writer_Stream('./debug.log');
$infoWriter = new Zend_log_Writer_Stream('./info.log');
$errorWriter = new Zend_log_Writer_Stream('./error.log');

ログレベルで振り分けるFilterを作り、Writerに追加
振り分けはdebug.logはDEBUG、info.logはINFO~WARN、error.logはERR~と考えると
$debugFilter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG ,"==");
$debugWriter->addFilter($debugFilter);

$infoStartFilter = new Zend_Log_Filter_Priority(Zend_Log::INFO);
$infoEndFilter = new Zend_Log_Filter_Priority(Zend_Log::WARN ,">=");
$infoWriter->addFilter($infoStartFilter);
$infoWriter->addFilter($infoEndFilter);

$errorFilter = new Zend_Log_Filter_Priority(Zend_Log::ERR);
$errorWriter->addFilter($errorFilter);
INFO~WARNの範囲制限を心配したけど、
writerとFilterが受け入れるように出来てたのでOKw

writerが出来上がったので、Logに追加。
Logに追加
$logger = new Zend_Log();
$logger->addWriter($debugWriter);
$logger->addWriter($infoWriter);
$logger->addWriter($errorWriter);
はい、いっちょあがり♪

実行すると、それぞれのログファイルにかかれます。

//debug.logへ
$logger->log('debug message',Zend_Log::DEBUG);

//info.logへ
$logger->log('Informational message',Zend_Log::INFO);
$logger->log('notice message',Zend_Log::NOTICE);
$logger->log('warning message',Zend_Log::WARN);

//error.logへ
$logger->log('error message',Zend_Log::ERR);
$logger->log('emergency message',Zend_Log::EMERG);
今日はこんぐらいにしとこうかな。

2007年11月4日日曜日

マックグリドル食べてみた

朝マックがマフィンからグリドルに変わって初です。
噂ではホットケーキだそうな。元々マフィンがあった時からマックの
ホットケーキを基本は食べてたんで、ちょと楽しみ。

最初は素のマックグリドルソーセージを頼んでみました。
見た目はバンズの表面にMマーク。あいかわらずの拘りようw
匂いはホットケーキの匂いがします。あとソーセージパティの
匂いもします。どっちかというとホットケーキの匂いのが強いかな。
食感は、、、バンズはホットケーキだ!!!
しかもバンズに何か練りこんである???シロップ?!
でも、、、うん、噂どおりのホットケーキ&ソーセージっぽい。


なかなか旨いw

ちょっと話が変わるけど、マックのハッシュポテトって昼も売って
くんないかな~。あれ、うまいんだよね