[[Tips]] > * log4php既知の問題 [#u39b8f38] #contents ** パッチ [#ccc2fc28] -以下の問題を修正するパッチです。最新版は、リビジョン692607で確認。 --[[最新用>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] -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()); *** ロギング位置出力不正(#2) [#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; *** パターン(%l)出力不正(#3) [#kda6d80b] -パターン ''%l''(ログ出力位置のすべての情報)を使うと、プロパティアクセス違反のエラーが発生してしまいます。原因は、LoggerLocationInfo クラスの protected なフィールドに直接アクセスしているためです。