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());

ロギング位置出力不正(#2: LOG4PHP-19

※この問題へのパッチは、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;

パターン(%l)出力不正(#3: LOG4PHP-17

※この問題へのパッチは、r699316でコードベースに取り込まれました。

  • パターン %l(ログ出力位置のすべての情報)を使うと、プロパティアクセス違反のエラーが発生してしまいます。原因は、LoggerLocationInfo? クラスの protected なフィールドに直接アクセスしているためです。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-10-04 (土) 12:01:40 (3977d)