Android、Java、Web系、Linux、マラソン等の備忘録

2012/02/19

【PHP】CodeIgniterのログ出力をサイズ単位にカスタマイズ

0 件のコメント

環境

CodeIgniter:Version 2.1.0

前置き

CodeIgniterは「application\config\config.php」の

/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|--------------------------------------------------------------------------
|
| If you have enabled error logging, you can set an error threshold to
| determine what gets logged. Threshold options are:
| You can enable error logging by setting a threshold over zero. The
| threshold determines what gets logged. Threshold options are:
|
| 0 = Disables logging, Error logging TURNED OFF
| 1 = Error Messages (including PHP errors)
| 2 = Debug Messages
| 3 = Informational Messages
| 4 = All Messages
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
| your log files will fill up very fast.
|
*/
$config['log_threshold'] = 3;


log_thresholdの値を3(または4)とかにして



log_message('debug', "hello CodeIgniter");


のように書けば「application/logs」ディレクトリへログが出力されますが、ファイル名が



log-2012-02-14.php
log-2012-02-15.php
log-2012-02-16.php
log-2012-02-17.php


という日付単位になっているため、tailコマンド等でログを追っていると日付を超えた瞬間ログが出力されなくなります。日付を超えて作業をしているような社畜にとってはありがたくない仕様です。





せっかくノリノリでコーディングをしていても、ログが出なくなる異変に気付き、今日の日付のファイル名でtailコマンドを打ち直すというちょっとした作業により、毎晩遅くまでご苦労さんwwと日付が変った事を思い知らせてくれるドS仕様にやる気をくじかれるわけです。これはいかんという事で、ログファイル名は固定で、あるサイズを超えるとアーカイブを作る(リネーム)するように変更したいと思います。





とは言え、CodeIgniterでログをカスタマイズするのはググればたくさん出てくると思うので、そちらを参考にしてもらう方が良いかもしれませんが、ファイルサイズをチェックしてリネームするかどうとか、config.phpいじるとか一連の流れを覚えておきたいのでメモしておきます。





カスタマイズ用のファイルを作成



このログのファイル名を決定している 諸悪の根源 実装はsystemディレクトリ内にある「system/libraries/Log.php」というファイルです。これを直接編集すれば直ちに動作も変るわけですが、systemディレクトリ内のファイルは触りたくないという事で、CodeIgniterのこちらのガイドに従い、




・コアシステムクラスの作成 : CodeIgniter ユーザガイド 日本語版

http://codeigniter.jp/user_guide_ja/general/core_classes.html



コアシステムのクラスをユーザバージョンのクラスと置き換えたり、コアシステムのクラスを拡張したりすることもできます。




Log.phpはライブラリのファイルですが置き換えたいと思います。以下手順を2つ




  1. system/libraries/Log.php をコピー


  2. application/libraries/MY_Log.phpとして配置



この頭の「MY_」が置き換えの味噌のようです。で早速MY_Log.phpのクラス名を以下のように修正。

class My_Log extends CI_Log {

これでカスタマイズ用のファイルが完成です。あら簡単。



コンフィグからファイル名とファイルサイズ上限を取ってくる



前仕様では日付をファイル名にしてるので、Log.phpはログを出力するパスだけ知ってれば良かったのですが、ファイル名を指定してやりたいのでconfig.phpから取得させるようにしたいと思います。冒頭のコンフィグのコードが書かれてる下あたりに記述してやればOKでしょう。



$config['log_file_name'] = 'hogehoge.php';
$config['log_file_size'] = 921600;


サイズは適当に900KBにしています。根拠は特にありません。



ログファイルをサイズ単位で出力するようにする



MY_Log.phpのwrite_logメソッド内の85行目~98行目あたりを修正しました。



$config =& get_config();
$filepath = $this->_log_path.$config['log_file_name'];
$message = '';
$openmode = FOPEN_WRITE_CREATE;

if ( file_exists($filepath))
{
// ファイルサイズチェック
if( filesize($filepath) > $config['log_file_size'] ) {
// サイズオーバーなので、コピー退避
$new_file = $this->_log_path.date('Y-m-d_His').'.php';
copy($filepath, $new_file);
// モード:書き出しのみでオープン
$openmode = FOPEN_WRITE_CREATE_DESTRUCTIVE;
}
}
else {
$message .= "<"."?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?".">\n\n";
}

if ( ! $fp = @fopen($filepath, $openmode))
{
return FALSE;
}


これでサイズの敷地を越えると、tailに



tail: hogehoge.php: ファイルが切り詰められまし


と表示されますが、再度コマンドを打つ事なくログを追う事ができます。



付け足すとするなら、前仕様でもそうですが、永遠とログを吐き続けるので運用段階では古いファイルを削除するような実装も欲しいですね。ログのバックアップを取って消すというトリガーでも良いかもしれませんが。



これで今夜から快適なログ出力ライフにのぞめます。

0 件のコメント :

コメントを投稿