Cakeログ 出力フォーマット カスタマイズ

Cakeログの出力はFileLogクラスのwriteメソッドで行われます。今回は、出力のフォーマットの変更をいくつか試してみました。

既存のライブラリを上書き(オーバーライド)する方法

writeメソッドは、/lib/Cake/Log/Engine/FileLog.phpにあります。
/app/Lib以下に同じ階層構造になるようにFileLog.phpをコピー
/app/Lib/Log/Engine/FileLog.php

あとは内容を変更するだけで関数を上書きすることができます。

*CakePHP 1.3の場合は、/cake/libs/log/file_log.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";
/lib/Cake/Log/Engine/FileLog.php
2.1 / 2.2 / 2.3 / 2.4
  • このエントリーをはてなブックマークに追加

関連記事

テキストから自動的にリンクを付与「autoLink」と除去「stripLinks」

Textヘルパーには、テキスト処理に関する便利な機能があります。ユーザによる投稿などを表示する際に、URLが貼り付けられている場合に自動的にリンクを付けてくれるautoLinkや、逆に、リンクが貼られ

Captchaプラグイン「Captcha Component & Helper」

Captchaプラグインを実装してみました。 ダウンロードはこちら 解凍して、このようになるようにそのままappディレクトリ下に置いてください。 app/Controller/Compone

テキストから指定文字数で抜粋「excerpt」「truncate」「tail」

Textヘルパーには、コントローラーから受けとったテキストデータを切り取り表示してくれるヘルパーが用意されています。先頭もしくは末尾から指定文字数を切り取ってくれる「truncate」「tail」、指

ユーザエージェントを取得

Windows XPサポート終了に伴い、移行を促すために有効な手段としてユーザのブラウザやOSの情報を取得して行動を促すというのがあると思います。 グローバル関数「env」でuser-agent

「isUnique」バリデーション

「isUnique」は、特定カラムの一意性を検証してくれるメソッドです。 2.5.6からは、複数フィールドにまたがる一意性検証にも対応するようになったようです。 使用方法 p

複数データベースの追加と切替

CakePHPで複数のデータベースに切替を行うということがあると思います。(個人的にはあまりない) 今回、CakePHPからWordpressのデータベースへの接続を行う機会があったので設定を試してみ

テキストから指定文字をハイライト「highlight」・配列をリストに展開「toList」・二重改行を<p>タグへ変換「autoParagraph」

Textヘルパーの「highlight」は、テキスト内の指定文字をハイライトしてくれます。検索結果の表示などに使用できそうです。デモ highlight テキスト内の指定文字ハイライト表示しま

シンプルに設置できる数字Captcha「MathCaptcha」

スパム防止などで利用されているCaptchaですが、数字版で使えるものがないか探してみました。この「MathCapthca」は非常にシンプルに設置できます。 ダウンロードはこちらから。 MathC

Comment

  1. お尋ねします。
    まったく同じ構成で、同じファイルをコピーするだけで、置き換えられるんですか?

    例えば、他の部分はそのまま利用して、$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部分だけ変更可能です。

      // app/Lib/Log/Engine/appFileLog.php
      App::uses('BaseLog', 'Log/Engine');
      class appFileLog extends BaseLog {
          public function write($type, $message) {
              // do something
          }
      }
      
      // app/Config/bootstrap.php
      CakeLog::config('debug', array(
          'engine' => 'AppFile',    // ログエンジンをFileLog->appFileLogへ変更
          'types' => array('notice', 'info', 'debug'),
          'file' => 'debug',
      ));
      CakeLog::config('error', array(
          'engine' => 'AppFile',    // ログエンジンをFileLog->appFileLogへ変更
          'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
          'file' => 'error',
      ));
      

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

PAGE TOP ↑