使えるシステムから使いたいシステムへ、有限会社アテージ

phpにはsyslog()やerror_log()というログ出力用の関数が標準で用意されていて、syslogに送ったり、指定したファイルに書きこむことができます。いずれの関数もちょっとしたデバッグには使えるのですが、システム全体にわたってきめ細かくログをとりたい場合には、素のままではとても使い物になりません。より高機能のロギングの仕組みを自作する方法もありますが、既製のものもいくつかあります。

今回はそのなかの1つ、Log4phpをご紹介します。

インストール

※PEARなのでソースパッケージをダウンロードして解凍後、src/main/phpをphpのパスの通った場所(include_pathで設定)にlog4phpという名前でコピーしても使えます。

概要

主要な構成要素は、Logger、Appender、Layoutの3つです。

Logger ログの要求を受け付けてロギングの処理を行う中心となるモジュールです。
Appender ログの送信先となるモジュールです。コンソールやファイル、syslogなどが用意されています。自作することもできます。
Layout ログを出力するときのフォーマットを指定します。
コードと設定ファイル

syslog()やerror_log()はログの出力先やメッセージを変更したりする場合、コードを編集する必要がありますが、Log4phpでは設定ファイルを編集することでこれらを変更することができます。

(1)コード

ログにはdebugやinfoなどのレベルがあり、設定ファイルで出力の有無をコントロールできます。レベルは以下の通りで、レベルごとにレベルと同じ名前のメソッドが定義されていて、その引数に出力するメッセージを渡します。

(高)FATAL->ERROR->WARN->INFO->DEBUG->TRACE(低)

(2)設定ファイル

設定はxmlで行いますが、phpの連想配列で直接していすることもできます。ini形式のファイルも利用できますが、filterと呼ばれる機能の指定ができないなどの制限がありますので、おすすめしません。

ここではxmlを使います。

このphpとxmlの読み方は・・・

  1. まずphpのgetLogger()の引数で指定した”myLogger”というname属性を持つlogger要素をxmlから探します。そのレベルはdebugでappenderは”myAppender”であることがわかります。
  2. 次に”myAppender”というname属性を持つappender要素を探します。その子要素のparamから、このappenderはmyLog.logというファイルにログを出力するということがわかります。

結局このphpのコードは、DEBUGレベル以上のログをmyLog.logに出力します。TRACEレベルのログは出力されません。

appenderとしてはsyslogや指定ファイルのほかにMongoDBやsocketなども指定できます。ログローテートするLoggerAppenderRollingFileというタイプのappenderも用意されています。詳しくはこちら。

出力形式

出力形式を変更するにはappender要素の子要素として、layout要素を追加します。class属性として他のものも指定できますが、通常はLoggerLayoutPatternを指定することになります。layout要素の子要素としてparam要素を追加して、出力形式を指定します。

conversionPatterでは、セッションIDや$_REQUESTの出力などの指定することができます。詳しくはこちら。

上のパターンを指定した場合には以下の出力となります。

以上みてきたように、log4phpを使用することでログの出力先やフォーマットの変更が設定ファイルを編集することで可能となります。