[[Tips]] >

* log4php既知の問題 [#u39b8f38]
#contents

** パッチ [#ccc2fc28]
COLOR(red){※r699322までですべてのパッチがコードベースに取り込まれていますので、それ以降のリビジョンであれば、パッチの必要はありません。}
-以下の問題を修正するパッチです。最新版は、リビジョン692777で確認。
--[[最新用>http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/log4php/trunk/patch/log4php.patch?root=phpcommons]](すべてのパッチを含む)
--[[r692010用>http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/log4php/trunk/patch/log4php-r692010.patch?root=phpcommons]](#1、#2のパッチを含む)
--[[r691512用>http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/log4php/trunk/patch/log4php-r691512.patch?root=phpcommons]](#1、#2のパッチを含む)

** 問題 [#j716a075]

*** 日時パターン(%d)フォーマット不正(#1) [#y3ea0586]
*** 日時パターン(%d)フォーマット不正(#1: [[LOG4PHP-18>https://issues.apache.org/jira/browse/LOG4PHP-18]]) [#y3ea0586]
COLOR(red){※この問題へのパッチは、[[r699319>http://svn.apache.org/viewvc?view=rev&revision=699319]]でコードベースに取り込まれました。}
-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-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 = preg_replace('/((?<!\\\\)(?:\\\\{2})*)u/', '${1}' . sprintf('%03d', $usecs), $this->df);
 
          return date($this->df, $event->getTimeStamp());
#code(diff){{
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-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 = preg_replace('/((?<!\\\\)(?:\\\\{2})*)u/', '${1}' . sprintf('%03d', $usecs), $this->df);

*** ロギング位置出力不正(#2) [#w7f8fb63]
         return date($this->df, $event->getTimeStamp());
}}

*** ロギング位置出力不正(#2: [[LOG4PHP-19>https://issues.apache.org/jira/browse/LOG4PHP-19]]) [#w7f8fb63]
COLOR(red){※この問題へのパッチは、[[r699322>http://svn.apache.org/viewvc?view=rev&revision=699322]]でコードベースに取り込まれました。}
-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;

*** パターン(%l)出力不正(#3) [#kda6d80b]
#code(diff){{
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;
}}
*** パターン(%l)出力不正(#3: [[LOG4PHP-17>https://issues.apache.org/jira/browse/LOG4PHP-17]]) [#kda6d80b]
COLOR(red){※この問題へのパッチは、[[r699316>http://svn.apache.org/viewvc?view=rev&revision=699316]]でコードベースに取り込まれました。}
-パターン ''%l''(ログ出力位置のすべての情報)を使うと、プロパティアクセス違反のエラーが発生してしまいます。原因は、LoggerLocationInfo クラスの protected なフィールドに直接アクセスしているためです。


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