Tips >
log4php既知の問題 †
パッチ †
※r699322までですべてのパッチがコードベースに取り込まれていますので、それ以降のリビジョンであれば、パッチの必要はありません。
- 以下の問題を修正するパッチです。最新版は、リビジョン692777で確認。
問題 †
日時パターン(%d)フォーマット不正(#1: LOG4PHP-18) †
※この問題へのパッチは、r699319でコードベースに取り込まれました。
- PHPのdate関数がミリ秒のフォーマットを行えないため、log4phpは日時フォーマット時(%d)に、最初にミリ秒部分を実際の値に置換してからdate関数を使っていますが、この置換処理で一部恣意的なフォーマットがあり、ユーザ指定のフォーマットを正しく処理しない場合があります。
- 以下のような修正を行います。まず、フォーマット文字列 \u を実際のミリ秒に置換する部分の恣意的な ,(カンマ)フォーマット文字列と正規表現を修正し、さらにPHP5.2.2から date関数のフォーマットに追加されたミリ秒(u)の処理を回避するため、\u を u に置換する部分を削除しています(5.2.2より前のバージョンで \u のままにしたとしても、\u 自体がメタキャラクタではないので、そのまま u と表示されるでしょう)。
1
2
3
4
5
6
7
8
9
10
| | 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());
|
※この問題へのパッチは、r699322でコードベースに取り込まれました。
- log4phpは、バックトレースを利用して、ロガークラスのメソッド呼び出しを基準にアプリケーションのロギング位置を取得していますが、ロガークラスのサブクラス判定が不十分となっています。以下のような修正(クラス名の小文字揃え)を行います。
1
2
3
4
5
6
7
8
9
10
11
12
| | 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;
|
※この問題へのパッチは、r699316でコードベースに取り込まれました。
- パターン %l(ログ出力位置のすべての情報)を使うと、プロパティアクセス違反のエラーが発生してしまいます。原因は、LoggerLocationInfo? クラスの protected なフィールドに直接アクセスしているためです。