読者です 読者をやめる 読者になる 読者になる

風柳メモ

ソフトウェア・プログラミング関連の覚書が中心。

レンタルサーバでlog4phpを使用するための覚書

php

log4php とは…

Apache Logging ServicesプロジェクトのPHP用・高機能なログフレームワーク(ログ出力ツール)。

Apache log4php™ is a versatile logging framework for PHP.

Apache log4php - Welcome - Apache log4php

出力先には画面やファイル等を指定でき、ログレベル等も使え、一定サイズでログを切り替えたりといった機能も持つ。

レンタルサーバへのインストール(PEAR経由)

PEARがインストールされていて、正常に使用できていることが前提。

log4php のインストール
  1. Channel Management で "pear.apache.org/log4php" を [Discover Channel]
  2. "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


注意点として、

サンプル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 />