2

log4php を使用しようとしていますが、構成を理解するのに問題があります。log4j xml の動作を同じ log4php xml と比較しています。同じコード。しかし、出力が異なります。ドキュメントからは、5 行がログに記録されると予想されますが、log4php では 1 行しか記録されません。どうか、私は自分自身を狂わせています。

PHP コード:

<?php

include("log4php/Logger.php");

Logger::configure('log4php.xml');

$rlogger = Logger::getRootLogger();
$rlogger->debug('Not logged');
$rlogger->error('Logged');

$logger = Logger::getLogger('com.suri');
$logger->debug('Logged');
$logger->warn('Logged');

$logger = Logger::getLogger('com.suri.factory');
$logger->debug('Not logged');
$logger->warn('Logged');

$logger = Logger::getLogger('com.suri.factory.Bar');
$logger->debug('Not logged');
$logger->info('Logged');

?>

XML 構成:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration xmlns="http://logging.apache.org/log4php/">
  <!-- A1 is set to be a ConsoleAppender -->
  <appender name="A1" class="LoggerAppenderConsole">
    <layout class="LoggerLayoutPattern">
      <param name="ConversionPattern" value="%d [%t] - %-5p %c - %m%n"/>
    </layout>
  </appender>

  <logger name="com.suri.factory.Bar">
    <level value="info"/>
  </logger>
  <logger name="com.suri.factory">
    <level value="warn"/>
  </logger>

  <logger name="com">
    <level value="debug"/>
  </logger>

  <root>
    <level value="error" />
    <appender-ref ref="A1" />
  </root>

</configuration>

出力:

2014-03-13T18:01:30-03:00 [14939] - ERROR root - Logged

予想される出力 (jython+log4j で同じ構成と同じコードで生成):

2014-03-13 18:09:03,591 [main] - ERROR root - Logged
2014-03-13 18:09:03,592 [main] - DEBUG com.suri - Logged
2014-03-13 18:09:03,592 [main] - WARN  com.suri - Logged
2014-03-13 18:09:03,592 [main] - WARN  com.suri.factory - Logged
2014-03-13 18:09:03,592 [main] - INFO  com.suri.factory.Bar - Logged

ジソンコード:

from org.apache.log4j import *
from org.apache.log4j.xml import *


if __name__ == '__main__':
    xml.DOMConfigurator.configure('log4j.xml')
    rlogger = LogManager.getRootLogger()
    rlogger.debug('Not logged');
    rlogger.error('Logged');

    logger = LogManager.getLogger('com.suri');
    logger.debug('Logged');
    logger.warn('Logged');

    logger = LogManager.getLogger('com.suri.factory');
    logger.debug('Not logged');
    logger.warn('Logged');

    logger = LogManager.getLogger('com.suri.factory.Bar');
    logger.debug('Not logged');
    logger.info('Logged');

Jython XML 構成:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <!-- A1 is set to be a ConsoleAppender -->
  <appender name="A1" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] - %-5p %c - %m%n"/> 
    </layout> 
  </appender>

  <logger name="com.suri.factory.Bar">
    <level value="info"/> 
  </logger>
  <logger name="com.suri.factory">
    <level value="warn"/>
  </logger>

  <logger name="com">
    <level value="debug"/>
  </logger>

  <root>
     <level value="error" />
    <appender-ref ref="A1" /> 
  </root>

</log4j:configuration>

ありがとう!

4

2 に答える 2

1

現在の構成では、Log4PHP はエラー レベル以下のログを記録しません。これは、構成されたロガー (ログ メッセージのエントリ ポイントと見なされる必要があります) が、構成されたしきい値以上のメッセージのみを渡し、ルート ロガーのみが実際にアペンダーを構成しているためです。ログ メッセージ レベルが IT のしきい値を超えている場合はログに記録します (つまり、ERROR レベルを下回るメッセージはログに記録されません)。

構成したい利用可能なすべてのロガーにアペンダーを追加することで、これを回避できます。そうすれば、このロガー自体がメッセージをアペンダーに書き込もうとし、さらにそれをチェーンに渡します。親ロガーのしきい値が元のロガー以下の場合、メッセージが 2 回書き込まれる可能性があることに注意してください。メッセージを上流に渡さないようにするには、additivity="false"属性を使用します。

実際には、すべてのロガーに対して同じアペンダーを複数回使用して一度だけ構成できることに注意してください。ただし、実際のロガーの構成方法に応じて、さまざまなレベルのメッセージをすべてログに記録します。

また、Log4PHP は log4j とは異なる製品であることに注意してください。見た目は似ていますが、開発者は必ずしも相互にやり取りしているわけではありません。また、同じ機能を同じ方法で有効にして同じ構成形式をサポートすることは、おそらく彼らのロードマップにはありませんでした。まったく異なるチームによる構成の決定を追加でサポートするのは難しい制限になるため、これは個々のプロジェクトにとって実際には良いことです。

最後に、次の構成をお勧めします。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration xmlns="http://logging.apache.org/log4php/">
  <!-- A1 is set to be a ConsoleAppender -->
  <appender name="A1" class="LoggerAppenderConsole">
    <layout class="LoggerLayoutPattern">
      <param name="ConversionPattern" value="%d [%t] - %-5p %c - %m%n"/>
    </layout>
  </appender>

  <logger name="com.suri.factory.Bar" additivity="false">
    <level value="info"/>
    <appender-ref ref="A1" />
  </logger>
  <logger name="com.suri.factory" additivity="false">
    <level value="warn"/>
    <appender-ref ref="A1" />
  </logger>

  <logger name="com" additivity="false">
    <level value="debug"/>
    <appender-ref ref="A1" />
  </logger>

  <root>
    <level value="error" />
    <appender-ref ref="A1" />
  </root>

</configuration>

構成ソースとして XML を使用するのを避け、代わりに PHP 配列構成を使用するとさらに良いでしょう。なぜなら、すべての要求で XML を解析する必要がなくなるためですが、PHP は構成ファイルをキャッシュすることができるからです (これはPHP コード) をオペコード キャッシュに格納します。現在の XML 構成を表す PHP 配列を取得するには、次のように結果をダンプできます。

$configurator = new LoggerConfiguratorDefault();
$config = $configurator->parse('/path/to/config.xml');
var_export($config); // prints to stdout
于 2014-03-31T18:40:16.033 に答える
0

しきい値レベルを最高 (あなたの場合はerror) に設定して、このロガーによって低いレベルがログに記録されないようにします。ここでロガーのしきい値を読んでください

xml 構成ファイルで次のように変更します。

<root>
  <level value="TRACE" />
  <appender-ref ref="A1" />
</root>

ここで異なるレベルのしきい値を参照してください。

log4phpによると:

ロガーにはしきい値レベルを割り当てることができます。このしきい値より低いレベルのすべてのロギング リクエストは無視されます。

たとえば、ロガーのしきい値を INFO に設定すると、レベルが TRACE および DEBUG のログ要求がこのロガーによってログに記録されないことを意味します。

お役に立てば幸いです。

于 2014-03-22T06:51:57.513 に答える