log4php とは…
Apache Logging ServicesプロジェクトのPHP用・高機能なログフレームワーク(ログ出力ツール)。
Apache log4php™ is a versatile logging framework for PHP.
Apache log4php - Welcome - Apache log4php
出力先には画面やファイル等を指定でき、ログレベル等も使え、一定サイズでログを切り替えたりといった機能も持つ。
レンタルサーバへのインストール(PEAR経由)
PEARがインストールされていて、正常に使用できていることが前提。
- PEAR本体のインストールはManual :: PEAR パッケージマネージャの取得とインストールの「ホスティング環境での PEAR」の項を参照(PEAR インストール レンタルサーバで検索すれば参考になるサイトが出てくる)
- ダウンロードした go-pear.php が使用できない(実行途中でエラーになってしまう)場合、PEARのブラウザによるインストールがうまくいかなかったのでgo-pear.phpを修正 - 風柳メモ
log4php のインストール
- Channel Management で "pear.apache.org/log4php" を [Discover Channel]
- "pear.apache.org/log4php" チャンネルから、"Apache_log4php" をインストール
使用サンプル
log4php用設定ファイル(log4php.properties)
# log4php.properties: log4php用設定ファイル # 参考: http://logging.apache.org/log4php/docs/configuration.html # === アペンダ(appenders)定義 # log4php.appender.{appender_name} # 参考: http://logging.apache.org/log4php/docs/appenders.html # http://logging.apache.org/log4php/docs/layouts/pattern.html # --- 出力無し設定 log4php.appender.dev_null = LoggerAppenderNull # --- 画面出力設定 log4php.appender.stdout = LoggerAppenderEcho log4php.appender.stdout.layout = LoggerLayoutPattern log4php.appender.stdout.layout.conversionPattern = "%date{Y-m-d H:i:s.u} %-14logger %-8level [%-15X{ADDR} %X{HOST}] %message%newline" # --- ファイル出力設定(一定サイズでログを切替) # http://logging.apache.org/log4php/docs/appenders/rolling-file.html log4php.appender.file = LoggerAppenderRollingFile # ■ log4php.appender.{name}.file は絶対パスで指定する必要あり # 参考: http://stackoverflow.com/questions/15666893/log4php-file-size-error log4php.appender.file.file = /path_to/app.log log4php.appender.file.append = true log4php.appender.file.maxFileSize = 5MB log4php.appender.file.maxBackupIndex = 5 log4php.appender.file.compress = false log4php.appender.file.layout = LoggerLayoutPattern log4php.appender.file.layout.conversionPattern = "%date{Y-m-d H:i:s.u} %-14logger %-8level [%-15X{ADDR} %X{HOST}] %message%newline" # === ロガー(logger)定義 # 参考: http://logging.apache.org/log4php/docs/loggers.html # --- root ロガー # log4php.rootLogger = {log_level}, {appender_name}[, {appender_name} ...] # ※ rootLogger は、全ての Logger::getLogger({logger_name}) の継承元となる # {log_level} → http://logging.apache.org/log4php/docs/introduction.html # {appender_name) → アペンダ定義で指定した名称(log4php.appender.{appender_name}) # <?php $root_logger = Logger::getRootLogger(); // RootLogger 取得 ?> log4php.rootLogger = FATAL, dev_null # --- 名前付きロガー # log4php.logger.{logger_name} = {log_level}, {appender_name}[, {appender_name} ...] # ※ 設定名({logger_name}) をLogger::getLogger({logger_name})で指定すると、log4php.rootLogger の継承+指定した設定のログとなる # ※ 本設定ファイル内で定義されていない{logger_name}を指定すると、root ロガーと等価になる # {logger_name} → Logger::getLogger({logger_name})で指定すると、log4php.rootLogger の継承+指定したアペンダのロガーが取得される # <?php $sample_logger = Logger::getLogger('sample'); // 名前を指定して Logger 取得 ?> log4php.logger.DefaultLogger = WARN, file log4php.logger.DebugLogger = DEBUG, stdout, file
注意点として、
- log4php.appender.{appender_name}.file でファイル名を指定する場合、絶対PATHで指定すること。
- log4php.rootLogger には、何も出力しない(LoggerAppenderNull)appender(dev_null)を割り当てている。これは、PHPプログラム中でログレベルを変えたい場合に、継承の関係でrootLoggerの設定が邪魔になってしまうのを防ぐため。
サンプルPHPファイル(test_log.php)
<?php require_once('log4php/Logger.php'); // === 設定ファイル読込 Logger::configure('log4php.properties'); // === MDC (_mapped diagnostic contexts_) 設定 // ※ log4php.appender.{appender_name}.layout.conversionPattern で、'%X{ADDR}' のようにして参照可能 // http://logging.apache.org/log4php/apidocs/class-LoggerMDC.html LoggerMDC::put('ADDR', isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '-'); LoggerMDC::put('HOST', isset($_SERVER['REMOTE_HOST']) ? $_SERVER['REMOTE_HOST'] : '-'); // === ロガー取得 $default_logger = Logger::getLogger('DefaultLogger'); $debug_logger = Logger::getLogger('DebugLogger'); $separator_logger = Logger::getLogger('separator'); $separator_logger->addAppender($debug_logger->getAppender('stdout')); $separator_logger->addAppender($debug_logger->getAppender('file')); $separator_logger->setLevel(LoggerLevel::getLevelDebug()); // === テスト $separator_logger->debug('1) DefaultLogger<br />'); $default_logger->trace('trace1<br />'); $default_logger->debug('debug1<br />'); $default_logger->info('info1<br />'); $default_logger->warn('warn1<br />'); $default_logger->error('error1<br />'); $default_logger->fatal('fatal1<br />'); $separator_logger->debug('==========<br />'); $separator_logger->debug('2) DebugLogger<br />'); $debug_logger->trace('trace2<br />'); $debug_logger->debug('debug2<br />'); $debug_logger->info('info2<br />'); $debug_logger->warn('warn2<br />'); $debug_logger->error('error2<br />'); $debug_logger->fatal('fatal2<br />'); $separator_logger->debug('==========<br />'); $separator_logger->debug('3) DefaultLogger (TRACE)<br />'); $default_logger->setLevel(LoggerLevel::getLevelTrace()); $default_logger->trace('trace3<br />'); $default_logger->debug('debug3<br />'); $default_logger->info('info3<br />'); $default_logger->warn('warn3<br />'); $default_logger->error('error3<br />'); $default_logger->fatal('fatal3<br />'); $separator_logger->debug('==========<br />'); $separator_logger->debug('4) DebugLogger (TRACE)<br />'); $debug_logger->setLevel(LoggerLevel::getLevelTrace()); $debug_logger->trace('trace4<br />'); $debug_logger->debug('debug4<br />'); $debug_logger->info('info4<br />'); $debug_logger->warn('warn4<br />'); $debug_logger->error('error4<br />'); $debug_logger->fatal('fatal4<br />'); $separator_logger->debug('==========<br />'); $separator_logger->debug('5) DefaultLogger (FATAL)<br />'); $default_logger->setLevel(LoggerLevel::getLevelFatal()); $default_logger->trace('trace5<br />'); $default_logger->debug('debug5<br />'); $default_logger->info('info5<br />'); $default_logger->warn('warn5<br />'); $default_logger->error('error5<br />'); $default_logger->fatal('fatal5<br />'); $separator_logger->debug('==========<br />'); $separator_logger->debug('6) DebugLogger (FATAL)<br />'); $debug_logger->setLevel(LoggerLevel::getLevelFatal()); $debug_logger->trace('trace6<br />'); $debug_logger->debug('debug6<br />'); $debug_logger->info('info6<br />'); $debug_logger->warn('warn6<br />'); $debug_logger->error('error6<br />'); $debug_logger->fatal('fatal6<br />'); $separator_logger->debug('==========<br />');
結果(画面出力)
2014-09-21 23:38:50.836 separator DEBUG [xxx.xxx.xxx.xxx -] 1) DefaultLogger 2014-09-21 23:38:50.838 separator DEBUG [xxx.xxx.xxx.xxx -] ========== 2014-09-21 23:38:50.838 separator DEBUG [xxx.xxx.xxx.xxx -] 2) DebugLogger 2014-09-21 23:38:50.838 DebugLogger DEBUG [xxx.xxx.xxx.xxx -] debug2 2014-09-21 23:38:50.839 DebugLogger INFO [xxx.xxx.xxx.xxx -] info2 2014-09-21 23:38:50.839 DebugLogger WARN [xxx.xxx.xxx.xxx -] warn2 2014-09-21 23:38:50.839 DebugLogger ERROR [xxx.xxx.xxx.xxx -] error2 2014-09-21 23:38:50.840 DebugLogger FATAL [xxx.xxx.xxx.xxx -] fatal2 2014-09-21 23:38:50.840 separator DEBUG [xxx.xxx.xxx.xxx -] ========== 2014-09-21 23:38:50.840 separator DEBUG [xxx.xxx.xxx.xxx -] 3) DefaultLogger (TRACE) 2014-09-21 23:38:50.842 separator DEBUG [xxx.xxx.xxx.xxx -] ========== 2014-09-21 23:38:50.842 separator DEBUG [xxx.xxx.xxx.xxx -] 4) DebugLogger (TRACE) 2014-09-21 23:38:50.842 DebugLogger TRACE [xxx.xxx.xxx.xxx -] trace4 2014-09-21 23:38:50.843 DebugLogger DEBUG [xxx.xxx.xxx.xxx -] debug4 2014-09-21 23:38:50.843 DebugLogger INFO [xxx.xxx.xxx.xxx -] info4 2014-09-21 23:38:50.843 DebugLogger WARN [xxx.xxx.xxx.xxx -] warn4 2014-09-21 23:38:50.844 DebugLogger ERROR [xxx.xxx.xxx.xxx -] error4 2014-09-21 23:38:50.844 DebugLogger FATAL [xxx.xxx.xxx.xxx -] fatal4 2014-09-21 23:38:50.844 separator DEBUG [xxx.xxx.xxx.xxx -] ========== 2014-09-21 23:38:50.845 separator DEBUG [xxx.xxx.xxx.xxx -] 5) DefaultLogger (FATAL) 2014-09-21 23:38:50.845 separator DEBUG [xxx.xxx.xxx.xxx -] ========== 2014-09-21 23:38:50.846 separator DEBUG [xxx.xxx.xxx.xxx -] 6) DebugLogger (FATAL) 2014-09-21 23:38:50.846 DebugLogger FATAL [xxx.xxx.xxx.xxx -] fatal6 2014-09-21 23:38:50.846 separator DEBUG [xxx.xxx.xxx.xxx -] ==========
結果(ログファイル:app.log)
2014-09-21 23:38:50.836 separator DEBUG [xxx.xxx.xxx.xxx -] 1) DefaultLogger<br /> 2014-09-21 23:38:50.837 DefaultLogger WARN [xxx.xxx.xxx.xxx -] warn1<br /> 2014-09-21 23:38:50.837 DefaultLogger ERROR [xxx.xxx.xxx.xxx -] error1<br /> 2014-09-21 23:38:50.837 DefaultLogger FATAL [xxx.xxx.xxx.xxx -] fatal1<br /> 2014-09-21 23:38:50.838 separator DEBUG [xxx.xxx.xxx.xxx -] ==========<br /> 2014-09-21 23:38:50.838 separator DEBUG [xxx.xxx.xxx.xxx -] 2) DebugLogger<br /> 2014-09-21 23:38:50.838 DebugLogger DEBUG [xxx.xxx.xxx.xxx -] debug2<br /> 2014-09-21 23:38:50.839 DebugLogger INFO [xxx.xxx.xxx.xxx -] info2<br /> 2014-09-21 23:38:50.839 DebugLogger WARN [xxx.xxx.xxx.xxx -] warn2<br /> 2014-09-21 23:38:50.839 DebugLogger ERROR [xxx.xxx.xxx.xxx -] error2<br /> 2014-09-21 23:38:50.840 DebugLogger FATAL [xxx.xxx.xxx.xxx -] fatal2<br /> 2014-09-21 23:38:50.840 separator DEBUG [xxx.xxx.xxx.xxx -] ==========<br /> 2014-09-21 23:38:50.840 separator DEBUG [xxx.xxx.xxx.xxx -] 3) DefaultLogger (TRACE)<br /> 2014-09-21 23:38:50.841 DefaultLogger TRACE [xxx.xxx.xxx.xxx -] trace3<br /> 2014-09-21 23:38:50.841 DefaultLogger DEBUG [xxx.xxx.xxx.xxx -] debug3<br /> 2014-09-21 23:38:50.841 DefaultLogger INFO [xxx.xxx.xxx.xxx -] info3<br /> 2014-09-21 23:38:50.841 DefaultLogger WARN [xxx.xxx.xxx.xxx -] warn3<br /> 2014-09-21 23:38:50.841 DefaultLogger ERROR [xxx.xxx.xxx.xxx -] error3<br /> 2014-09-21 23:38:50.842 DefaultLogger FATAL [xxx.xxx.xxx.xxx -] fatal3<br /> 2014-09-21 23:38:50.842 separator DEBUG [xxx.xxx.xxx.xxx -] ==========<br /> 2014-09-21 23:38:50.842 separator DEBUG [xxx.xxx.xxx.xxx -] 4) DebugLogger (TRACE)<br /> 2014-09-21 23:38:50.842 DebugLogger TRACE [xxx.xxx.xxx.xxx -] trace4<br /> 2014-09-21 23:38:50.843 DebugLogger DEBUG [xxx.xxx.xxx.xxx -] debug4<br /> 2014-09-21 23:38:50.843 DebugLogger INFO [xxx.xxx.xxx.xxx -] info4<br /> 2014-09-21 23:38:50.843 DebugLogger WARN [xxx.xxx.xxx.xxx -] warn4<br /> 2014-09-21 23:38:50.844 DebugLogger ERROR [xxx.xxx.xxx.xxx -] error4<br /> 2014-09-21 23:38:50.844 DebugLogger FATAL [xxx.xxx.xxx.xxx -] fatal4<br /> 2014-09-21 23:38:50.844 separator DEBUG [xxx.xxx.xxx.xxx -] ==========<br /> 2014-09-21 23:38:50.845 separator DEBUG [xxx.xxx.xxx.xxx -] 5) DefaultLogger (FATAL)<br /> 2014-09-21 23:38:50.845 DefaultLogger FATAL [xxx.xxx.xxx.xxx -] fatal5<br /> 2014-09-21 23:38:50.845 separator DEBUG [xxx.xxx.xxx.xxx -] ==========<br /> 2014-09-21 23:38:50.846 separator DEBUG [xxx.xxx.xxx.xxx -] 6) DebugLogger (FATAL)<br /> 2014-09-21 23:38:50.846 DebugLogger FATAL [xxx.xxx.xxx.xxx -] fatal6<br /> 2014-09-21 23:38:50.846 separator DEBUG [xxx.xxx.xxx.xxx -] ==========<br />