スキップしてメイン コンテンツに移動

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

環境

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: ファイルが切り詰められまし


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



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



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

コメント

このブログの人気の投稿

Javaでprivateなfieldやmethodにアクセスする

JUnitでテストしてると、privateなフィールドにアクセスして、値を参照したりセットしたりしたくなるわけですが、よく使うのでメモしておきます。 例えば、次のような対象のクラスがあるとします。 public class ParentClass { private String hoge = "ParentClass!!"; public void dispMsg() { System.out.println("dispMsg:" + hoge); } private void privateDispMsg(String msg) { System.out.println("dispMsg:" + msg); } }

GolangでWindows GUIアプリケーション

GUIアプリ作成の前提 社内ツールとしてexeで配布 開発環境はGoLandを使う 社内ツールとしてexeを配布ということであれば、Visual StudioでC#による開発だと思います。しかしながら、Go言語を習得したいのと、GoLandの補完機能が便利で、Android Studio使っていたこともあり、とっつきやすいという点からGo縛りでGUIアプリケーションを考えたいと思います。 lxn/walk Windows application library kit for Go. Windows向けしか考えていないので、まずこのライブラリなのですが、ボタンやコンボボックスが思ったように並ばなかったり、手軽にイメージボタンを配置したりなど、簡単にレイアウトを変更できない課題に直面しました。レイアウト作成だけで時間を取られてしまいます。そう言えば、Androidアプリ開発のときは、XMLでデザイン部分を切り離してたのを思い出して、今回の調査の運びとなりました。 fyne-io/fyne Cross platform native GUIs designed for Go based on Material Design. Supports: Linux, macOS, Windows, BSD, iOS and Android. walkと比べると、クロスプラットフォームで作成できるのですが、こちらもコードの中にデザインを書いていく形でした。 therecipe/qt therecipe/qt allows you to write Qt applications entirely in Go or JavaScript. Qt Creatorなるものがあるようで、デザイン部分を切り離せる印象はあるものの、最新のPCでもビルドに時間がかかるようで、学習コストもかかるという記事を見かけて断念しました。 どうしたものかとツイートしましたら、下記のようにご助言をいただいた。 同じ課題に対し色々試した結果、PWAのフルキャッシュドに落ち着いた。中身はGo+WASMで。 https://t.co/e60whDTV16 — のぼのぼ📡 (@nobonobo) July 21, 2020 PWA 早速調べてみました。Googleが進めているプロジェクトで、ネイティブアプリのよ

Eclipseの高速化メモ

Eclipseが重いと一言に言っても、いろいろな工程での話があると思いますが、過去記事のなども含めてこの記事にピックアップしておきたいと思います。以下はWindows環境での話です。