2

log4phpにメッセージを記録するために使用していますphp。次のxml構成があります

<configuration xmlns="http://logging.apache.org/log4php/">
    <appender name="myAppender" class="LoggerAppenderFile">
        <layout class="LoggerLayoutPattern">
            <param name="conversionPattern" value="%d{Y-m-d H:i:s} %c %-5p %F %L %m%n" />
        </layout>
        <param name="file" value="myLog.log" />
    </appender>

    <root>
        <level value="TRACE" />
        <appender_ref ref="myAppender" />
    </root>
</configuration>

気になる部分は

<param name="conversionPattern" value="%d{Y-m-d H:i:s} %c %-5p %F %L %m%n" />

%Fファイル名を取得するための指定子です。これにより、メッセージがログ ファイルに記録されます。ログに記録されたメッセージの例を次に示します。

2012-09-23 22:15:04 myLog FATAL /media/study/code/live/public_html/log.php 18 私のメッセージです。

問題

log.phpここでは、ファイルの完全なパス ( ) ではなく、ファイル名 (この場合) のみを表示したいと考えて/media/study/code/live/public_html/log.phpいます。Apache ドキュメントと SOを検索しましたが、このリファレンスには何も見つかりませんでした。

これを達成するためのヒントはありますか?

4

2 に答える 2

4

このタスクは、コードを追加するだけで完了できます。

当然のことながら、パターン レイアウトは で構成され、変換パターンで理解されるすべてのパターンを定義layouts/LoggerLayoutPattern.phpする長い配列があります。protected static $defaultConverterMapご覧のとおり、文字「F」は のLoggerPatternConverterFileクラスにリンクされていpatterns/LoggerPatternConverterFile.phpます。ざっと見てみると、次のことがわかります。

public function convert(LoggerLoggingEvent $event) {
    return $event->getLocationInformation()->getFileName();
}

それが完全なファイルパスの原因です。basename() 関数の呼び出しを追加すると、必要な結果が返されますが、これは Log4PHP の更新に耐えられないことに注意してください。ただし、追加することはできます。

永続的な変更が必要な場合は、前述の 2 つのクラスを拡張し、それらを独自のオートローディングに追加するか、以下を含める必要があります。

最初に LoggerPatternConverterFile を拡張します。これにより、関連ファイルのベース名が表示されます。

class LoggerPatternConverterFileBasename extends LoggerPatternConverterFile
{
    public function convert(LoggerLoggingEvent $event) {
      return basename(parent::convert($event));
    }
}

次に、LoggerLayoutPattern クラスを拡張します

class YourLoggerLayoutPattern extends LoggerLayoutPattern {
  public function __construct() {
    parent::__construct();
    $this->converterMap['f'] = 'LoggerPatternConverterFileBasename';
  }
}

このようにして、「小文字 f」の場合、ファイルのベース名のみが表示されるように定義しました。

構成では、変更された変換文字列を使用して、この新しい YourLoggerLayoutPattern クラスを参照するだけです。

この変更は、log4php の更新後も存続するはずです。

于 2012-10-12T23:06:41.533 に答える