phpにはsyslog()やerror_log()というログ出力用の関数が標準で用意されていて、syslogに送ったり、指定したファイルに書きこむことができます。いずれの関数もちょっとしたデバッグには使えるのですが、システム全体にわたってきめ細かくログをとりたい場合には、素のままではとても使い物になりません。より高機能のロギングの仕組みを自作する方法もありますが、既製のものもいくつかあります。
今回はそのなかの1つ、Log4phpをご紹介します。
インストール
1 2 |
pear channel-discover pear.apache.org/log4php pear install log4php/Apache_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(低)
1 2 3 4 5 6 7 8 9 |
<?php require_once('log4php/Logger.php'); Logger::configure(dirname(__FILE__).'/config.xml'); // 設定ファイルの読み込み $logger = Logger::getLogger('myLogger'); // myLoggerという名前のloggerを使用 // 以下ログの出力 $logger->debug("debug message"); $logger->trace("trace message"); ?> |
(2)設定ファイル
設定はxmlで行いますが、phpの連想配列で直接していすることもできます。ini形式のファイルも利用できますが、filterと呼ばれる機能の指定ができないなどの制限がありますので、おすすめしません。
ここではxmlを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<configuration xmlns="http://logging.apache.org/log4php/"> <appender name="default" class="LoggerAppenderFile"> <param name="file" value="default.log" /> </appender> <appender name="myAppender" class="LoggerAppenderFile"> <param name="file" value="myLog.log" /> </appender> <root> <level value="warn" /> <appender_ref ref="default" /> </root> <logger name="myLogger"> <level value="debug" /> <appender_ref ref="myAppender" /> </root> </configuration> |
このphpとxmlの読み方は・・・
- まずphpのgetLogger()の引数で指定した”myLogger”というname属性を持つlogger要素をxmlから探します。そのレベルはdebugでappenderは”myAppender”であることがわかります。
- 次に”myAppender”というname属性を持つappender要素を探します。その子要素のparamから、このappenderはmyLog.logというファイルにログを出力するということがわかります。
結局このphpのコードは、DEBUGレベル以上のログをmyLog.logに出力します。TRACEレベルのログは出力されません。
appenderとしてはsyslogや指定ファイルのほかにMongoDBやsocketなども指定できます。ログローテートするLoggerAppenderRollingFileというタイプのappenderも用意されています。詳しくはこちら。
1 |
DEBUG - debug message |
出力形式
出力形式を変更するにはappender要素の子要素として、layout要素を追加します。class属性として他のものも指定できますが、通常はLoggerLayoutPatternを指定することになります。layout要素の子要素としてparam要素を追加して、出力形式を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<configuration xmlns="http://logging.apache.org/log4php/"> <appender name="default" class="LoggerAppenderFile"> <param name="file" value="default.log" /> </appender> <appender name="myAppender" class="LoggerAppenderFile"> <param name="file" value="myLog.log" /> <layout class="LoggerLayoutPattern"> <param name="conversionPattern" value="%date{Y-m-d H:i:s.u} %logger %-5level %sessionid %file(%line) %msg%n" /> </layout> </appender> <root> <level value="warn" /> <appender_ref ref="default" /> </root> <logger name="myLogger"> <level value="debug" /> <appender_ref ref="myAppender" /> </logger> </configuration> |
conversionPatterでは、セッションIDや$_REQUESTの出力などの指定することができます。詳しくはこちら。
上のパターンを指定した場合には以下の出力となります。
1 |
2013-03-13 10:28:22.086 myLogger DEBUG 26qpf1sop0m7jem9jghges2h07 /public/index.php(361) debug message |
以上みてきたように、log4phpを使用することでログの出力先やフォーマットの変更が設定ファイルを編集することで可能となります。