2

我正在尝试使用 log4php 并且在理解配置时遇到问题,我正在比较从 log4j xml 到相同的 log4php xml 的行为。相同的代码。但是输出不同。从文档中,我希望记录 5 行,但在 log4php 中,只有一个。拜托,我快把自己逼疯了。

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

jython代码:

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 级别的消息都不会被记录),则记录。

您可以通过将附加程序添加到要配置的每个可用记录器来解决它。这样,这个 logger 自己会尝试将消息写入 appender,另外会将它传递到链上。请注意,如果父记录器的阈值等于或小于原始记录器,这可能会导致消息被写入两次。为避免将消息传递到上游,您将使用该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 回答