[[Tips]] >

* log4php既知の問題 [#u39b8f38]

** パッチ [#ccc2fc28]
-以下のすべての問題を修正するパッチです。
--[[r692010用>http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/log4php/trunk/patch/log4php-r692010.patch?root=phpcommons]]
--[[r691512用>http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/log4php/trunk/patch/log4php-r691512.patch?root=phpcommons]]

** 問題 [#j716a075]

*** 日時フォーマット不正 [#y3ea0586]
-PHPのdate関数がミリ秒のフォーマットを行えないため、log4phpは日時フォーマット時(%d)に、最初にミリ秒部分を実際の値に置換してからdate関数を使っていますが、この置換処理で一部恣意的なフォーマットがあり、ユーザ指定のフォーマットを正しく処理しない場合があります。
-以下のような修正を行います。まず、フォーマット文字列 \u を実際のミリ秒に置換する部分の恣意的な '',(カンマ)''フォーマット文字列と正規表現を修正し、さらにPHP5.2.2から date関数のフォーマットに追加されたミリ秒(u)の処理を回避するため、\u を u に置換する部分を削除しています(5.2.2より前のバージョンで \u のままにしたとしても、\u 自体がメタキャラクタではないので、そのまま u と表示されるでしょう)。
 diff -urN log4php/helpers/LoggerPatternConverter.php log4php.new/helpers/LoggerPatternConverter.php
 --- log4php/helpers/LoggerPatternConverter.php  2008-09-03 13:34:49.000000000 +0900
 +++ log4php.new/helpers/LoggerPatternConverter.php      2008-09-03 13:39:08.000000000 +0900
 +++ log4php.new/helpers/LoggerPatternConverter.php      2008-09-04 21:51:43.000000000 +0900
 @@ -289,7 +289,7 @@
      {
          $timeStamp = $event->getTimeStamp();
          $usecs = round(($timeStamp - (int)$timeStamp) * 1000);
 -        $this->df = str_replace("\u", "u", ereg_replace("[^\\]u", sprintf(',%03d', $usecs), $this->df));
 +        $this->df = ereg_replace('(^|[^\\](\\\\{2,2})*)u', '\1' . sprintf('%03d', $usecs), $this->df);
 +        $this->df = preg_replace('/((?<!\\\\)(?:\\\\{2})*)u/', '${1}' . sprintf('%03d', $usecs), $this->df);
 
          return date($this->df, $event->getTimeStamp());

*** ロギング位置出力不正 [#w7f8fb63]
-log4phpは、バックトレースを利用して、ロガークラスのメソッド呼び出しを基準にアプリケーションのロギング位置を取得していますが、ロガークラスのサブクラス判定が不十分となっています。以下のような修正(クラス名の小文字揃え)を行います。
 diff -urN log4php/spi/LoggerLoggingEvent.php log4php.new/spi/LoggerLoggingEvent.php
 --- log4php/spi/LoggerLoggingEvent.php  2008-09-03 13:34:48.000000000 +0900
 +++ log4php.new/spi/LoggerLoggingEvent.php      2008-09-03 21:46:51.000000000 +0900
 @@ -184,7 +184,8 @@
                  while ($hop !== null) {
                      $className = @strtolower($hop['class']);
                      if ( !empty($className) and ($className == 'logger' or $className == 'loggercategory' or
 -                                get_parent_class($className) == 'logger') or get_parent_class($className) == 'loggercategory') {
 +                                @strtolower(get_parent_class($className)) == 'logger' or
 +                                @strtolower(get_parent_class($className)) == 'loggercategory')) {
                          $locationInfo['line'] = $hop['line'];
                          $locationInfo['file'] = $hop['file'];
                          break;


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS