Cakeログ 出力フォーマット カスタマイズ
Cakeログの出力はFileLogクラスのwriteメソッドで行われます。今回は、出力のフォーマットの変更をいくつか試してみました。
既存のライブラリを上書き(オーバーライド)する方法
writeメソッドは、/lib/Cake/Log/Engine/FileLog.phpにあります。
/app/Lib以下に同じ階層構造になるようにFileLog.phpをコピー
/app/Lib/Log/Engine/FileLog.php
あとは内容を変更するだけで関数を上書きすることができます。
Cakeログをミリ秒まで出力させる
正確性については議論が分かれるところですが、時刻をミリ秒まで出力させてみます。
// オリジナル $output = date('Y-m-d H:i:s') . ' ' . ucfirst($type) . ': ' . $message . "\n"; // ミリ秒出力 list($microSec, $timeStamp) = explode(" ", microtime()); $output = date('Y-m-d H:i:', $timeStamp) . (date('s', $timeStamp) + $microSec) . ' ' . ucfirst($type) . ': ' . $message . "\n";
カンマ(タブ)区切り
Cakeログのフォーマットはデフォルトでは、
[時刻][半角SP][デバッグタイプ][コロン][半角SP][ログの内容]
となっています。
わざわざ書くまでも無いかもしれませんが、
// オリジナル $output = date('Y-m-d H:i:s') . ' ' . ucfirst($type) . ': ' . $message . "\n"; // カンマ区切り $output = date('Y-m-d H:i:s') . ',' . ucfirst($type) . ',' . $message . "\n"; // タブ区切り $output = date('Y-m-d H:i:s') . "\t" . ucfirst($type) . "\t" . $message . "\n";
セッションIDを出力させる
複数ユーザが存在する場合は、セッションIDなどを出力させると解析が楽になります。
// オリジナル $output = date('Y-m-d H:i:s') . ' ' . ucfirst($type) . ': ' . $message . "\n"; // セッションIDを出力 $output = date('Y-m-d H:i:s') . ',' . CakeSession::read('Auth.User.id') . ',' . ucfirst($type) . ',' . $message . "\n";
2.1 / 2.2 / 2.3 / 2.4
関連記事
-
「isUnique」バリデーション
「isUnique」は、特定カラムの一意性を検証してくれるメソッドです。 2.5.6からは、複数フィールドにまたがる一意性検証にも対応するようになったようです。 使用方法 p
-
複数データベースの追加と切替
CakePHPで複数のデータベースに切替を行うということがあると思います。(個人的にはあまりない) 今回、CakePHPからWordpressのデータベースへの接続を行う機会があったので設定を試してみ
-
テキストから指定文字数で抜粋「excerpt」「truncate」「tail」
Textヘルパーには、コントローラーから受けとったテキストデータを切り取り表示してくれるヘルパーが用意されています。先頭もしくは末尾から指定文字数を切り取ってくれる「truncate」「tail」、指
-
テキストから自動的にリンクを付与「autoLink」と除去「stripLinks」
Textヘルパーには、テキスト処理に関する便利な機能があります。ユーザによる投稿などを表示する際に、URLが貼り付けられている場合に自動的にリンクを付けてくれるautoLinkや、逆に、リンクが貼られ
-
シンプルに設置できる数字Captcha「MathCaptcha」
スパム防止などで利用されているCaptchaですが、数字版で使えるものがないか探してみました。この「MathCapthca」は非常にシンプルに設置できます。 ダウンロードはこちらから。 MathC
-
Captchaプラグイン「Captcha Component & Helper」
Captchaプラグインを実装してみました。 ダウンロードはこちら 解凍して、このようになるようにそのままappディレクトリ下に置いてください。 app/Controller/Compone
-
テキストから指定文字をハイライト「highlight」・配列をリストに展開「toList」・二重改行を<p>タグへ変換「autoParagraph」
Textヘルパーの「highlight」は、テキスト内の指定文字をハイライトしてくれます。検索結果の表示などに使用できそうです。デモ highlight テキスト内の指定文字ハイライト表示しま
-
ユーザエージェントを取得
Windows XPサポート終了に伴い、移行を促すために有効な手段としてユーザのブラウザやOSの情報を取得して行動を促すというのがあると思います。 グローバル関数「env」でuser-agent
Comment
お尋ねします。
まったく同じ構成で、同じファイルをコピーするだけで、置き換えられるんですか?
例えば、他の部分はそのまま利用して、$messageだけ編集してそのままwrite等に渡してやりたいのですが。
コメントありがとうございます。
そうですね。本文通りコピーするとクラスは同じ名前で置き換えることができます。
ただし、writeに渡される$messageは"CakeLog::write"や"$this->log"から渡されるメッセージ(ログ)そのものですので、コントローラ側で編集することになると思います。
早速のレス、ありがとうございます。
Cakephpと、オブジェクト指向がまだ良くわかっていないのですが、
これは、FileLog.phpを lib/Cake/Log/Engine から、全然読まなくなることになるのでしょうか?
そうすると、writeメソッドだけを置き換えたいということは、無理なんですか?(必要な部分だけを置き換えたいのです)
「class appFileLog extends FileLog {」とかしても、大丈夫なのでしょうか?
他の「CakeLog::alert」とか、「CakeLog::debug」とかにも影響させるられるのでしょうか?
自分でもまったく同じファイルを置いて、メッセージ内容を置き換えて見るところまでは上手くいきました。
いろいろ考え直した結果、
appContorol.php で、編集するようにメソッド追加した方が良く思えてきたので、そちらにしました。
しかし、"/app/Lib"については、詳しく知りたいですね。
ソースも解析してみますが、ここを上手に利用している人がいないか探してみます。
ありがとうございました。
やり方としては2通りあるかと思います。
1) オーバーライドする
/lib/Cake/Log/Engine/FileLog.phpを/app/Lib/Log/Engine/FileLog.phpと丸々コピーして変更したい部分だけ編集する。
2) ログエンジンを新たに作成する
こうやると、CakeLog::alertやCakeLog::debugもappFileLogを継承することになるので、write部分だけ変更可能です。