当前位置: 首页 > 知识库问答 >
问题:

log4j2中的层次结构没有像我预期的那样工作

长孙阳焱
2023-03-14

下面是一个类和log4j配置:

$vi My.java

public class My {
    private static final Logger logger = LogManager.getLogger("foo.bar"); 
      
    public static void main(String[] args) {
        logger.trace("My trace");
        logger.debug("My debug");
        logger.info("My info");
        logger.warn("My warn");
        logger.error("My error");
...

$vi log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Appenders>
        <Console name="console" target="system_out">
            <PatternLayout pattern="%d %-5p %c : %m%n" />
        </Console>
        <File name="foo" fileName="logs/foo.log">
            <PatternLayout pattern="%d %-5p %c : %m%n" />
        </File>
        <File name="foo.bar" fileName="logs/foo.bar.log">
            <PatternLayout pattern="%d %-5p %c : %m%n" />
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="console" />
        </Root>
        <Logger name="foo" level="info" additivity="false">
            <AppenderRef ref="foo" />
        </Logger>
        <Logger name="foo.bar" level="warn" additivity="false">
            <AppenderRef ref="foo.bar" />
        </Logger>
    </Loggers>
</Configuration>

在日志/foo.bar.log中出现警告错误消息。这是我所期望的。但是在日志/foo.log中什么都没有出现,我期望那里有info消息。在控制台上也什么都没有出现,但是我期望debug消息。所以它没有像我预期的那样工作。那么我的错误是什么?

还有LogManager的论点。getLogger必须是记录器的名称。但我也看到了论点是类的例子。这是如何工作的,因为当我这样做时,只有根记录器记录消息。

共有1个答案

酆耀
2023-03-14

Log4j2中有两种继承:

  • 记录器配置的继承,也称为“记录器层次结构”,将导致名为“foo.bar.baz”的记录器使用其最近祖先(“foo.bar”)的配置。您的“foo.bar”记录器使用您显式提供的配置
  • appender的继承,也称为“可加性”,这将导致记录器配置继承其父级的所有appender,除非您使用添加性=“false”。在您的例子中,“foo.bar”配置不使用“foo”配置的附加器

配置的另一个问题是,“foo.bar”记录器的级别设置为“警告”,因此它永远不会发送任何级别不同于“警告”和“错误”的日志事件。如果您不想限制记录器本身,而是appender,可以在

如果您的目的是将不同的日志级别拆分为不同的日志文件,您可以混合使用级别设置(基本上是阈值过滤器)和LevelMatchFilters(或RoutingAppender):

xml prettyprint-override"><Logger name="foo.bar" level="DEBUG" additivity="false">
  <AppenderRef ref="foo.bar" level="WARN" />
  <AppenderRef ref="foo">
    <LevelMatchFilter level="INFO" />
  </AppenderRef>
  <AppenderRef ref="console">
    <LevelMatchFilter level="DEBUG" />
  </AppenderRef>
</Logger>

 类似资料:
  • 我正在使用wedriveri o 4.5: 我需要等到某个元素存在,如果它不存在,处理这种情况。 例如: 但如果页面上不存在元素,webdriver会将我的测试标记为失败,并显示消息:“超时10000毫秒。”。尝试减少运行时间或增加测试规格的超时时间(http://webdriver.io/guide/testrunner/timeouts.html); 如果回复promise,确保其得到解决 >

  • 我想使用查找从一个集合中获取一些数据并将其放入另一个集合中。 在localfield或foreignfield中写什么都不重要,因为它从player_game_stats中获取所有数据并将其插入player集合中的每个文档中。我想检查localfield和foreignField是否相等,但lookup不检查这一点。我对mongodb使用NoSqlBooster

  • 然后更新状态: 由于应该合并,我希望它是: 但相反,它会吃掉id,状态为: 这是预期的行为吗?只更新嵌套状态对象的一个属性的解决方案是什么?

  • 我试图执行一个简单的浏览器测试 浏览器立即启动并关闭,引发以下错误 HTTP请求路径为空意味着什么?新版本的watir是否更改了调用参数? 有人遇到过类似的问题吗? 我的系统是Windows 7 64位,我运行在一个代理之后,浏览器已经配置了一个代理 ---编辑--- 我引入了一个尾随斜杠,但我现在得到了一个新的错误,也得到了以前的错误,每次我都要更改代码并保存它来获得这个错误 ---编辑---

  • 你好,亲爱的StackOverflow社区,我最近遇到了一个问题,我不能把一个已经保存的对象的引用放进去。我不想保存或更新对象,因为这些对象是预先插入到我们的数据库中的。 所以基本上我的情况是这样的:我有一个父,在本例中它是一个摄取,对象有一个IntakeTimes列表,它们被声明为remainingdoses。有道理,嗯。 我的模型看起来如下: 我期待着任何帮助或提示,谢谢社区。