Php log4ppp是反直观的(不符合记录器级别)

Php log4ppp是反直观的(不符合记录器级别),php,log4j,log4php,Php,Log4j,Log4php,我试图使用log4php,但在理解 在配置中,我比较了log4jxml和log4php的行为 相同的xml。相同的代码。但输出不同。从 文档我希望记录5行,但只记录在log4ppp中 一个是。 拜托,我快把自己逼疯了 PHP代码: <?php include("log4php/Logger.php"); Logger::configure('log4php.xml'); $rlogger = Logger::getRootLogger(); $rlogger->debug('N

我试图使用log4php,但在理解 在配置中,我比较了log4jxml和log4php的行为 相同的xml。相同的代码。但输出不同。从 文档我希望记录5行,但只记录在log4ppp中 一个是。 拜托,我快把自己逼疯了

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

?>
预期输出(在jython+log4j中使用相同的配置和代码生成):

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" ?>
<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>
<?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>


谢谢

您将阈值级别设置为最高(在您的情况下为
错误
),因此此记录器不会记录较低的级别

在xml配置文件中更改以下内容:

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

根据Log4HP:

可以为记录器分配阈值级别。级别低于此阈值的所有日志记录请求都将被忽略

例如,将logger threshold设置为INFO意味着此logger不会记录具有跟踪和调试级别的日志记录请求


希望它对您有用。

按照当前的配置方式,log4ppp不会记录任何低于错误级别的内容。这是因为任何配置的记录器(应视为日志消息入口点)只传递等于或高于其配置阈值的消息,并且实际上只有根记录器配置了附加器,只有当日志消息级别高于其阈值时,它才会记录到该附加器(即,任何低于错误级别的消息都不会被记录)

您可以通过向要配置的每个可用日志程序添加appender来解决此问题。这样,此日志程序本身将尝试将消息写入appender,并将消息向上传递。请注意,如果父日志程序的阈值等于或小于原始lo,则可能会导致消息写入两次为了避免向上游传递消息,您应该使用
additivity=“false”
属性

请注意,事实上,您可以多次使用同一个appender,以便所有记录器只能配置一次,但根据实际记录器的配置方式记录所有不同级别的消息

还要注意的是,Log4HP与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>

这不是一个解决方案。降低根级别只会让它记录每一条消息。检查代码,它会记录不应该记录的消息。此外,我相信log4ppp中有一个实现错误。为什么对同一配置它会有不同的工作方式?抱歉,如果我显得直截了当。但我发现两种实现的工作方式不同,这让我非常沮丧ly.log4ppp生成此输出
2014-03-13T18:01:30-03:00[14939]-ERROR root-Logged
对于您的代码,这是正确的,因为您的日志级别设置为
ERROR
。请参阅我的更新答案。我的主要问题是,相同的配置,log4ppp和log4j中的相同代码会生成不同的日志。阅读文档时,我会想到,如果我为日志记录链下游的日志设置了不同的日志阈值,则使用tha进行日志记录t记录器应打印预期的消息(“代码中记录的”消息)我认为这是对我的问题的正确答案。我认为Log4PHP的设计方式是有缺陷的,它应该尽可能多地模仿Log4J,否则改变名字。而且,我觉得文档是错误的,并且它的实现方式需要更多的配置(所有的可加性)。谢谢!
<root>
  <level value="TRACE" />
  <appender-ref ref="A1" />
</root>
<?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>
$configurator = new LoggerConfiguratorDefault();
$config = $configurator->parse('/path/to/config.xml');
var_export($config); // prints to stdout