不同方法的单独记录器



我使用记录器打印特定于某些方法的跟踪。这样,当我想调试代码时,我可以只在我关心的方法中激活跟踪。

我曾经可以用log4jv1来做到这一点。我会用这样的记录器来检测选定的方法:

private static void method1() {
Logger logger = Logger.getLogger("org.examples.method1");
logger.debug("Hello from method1");
etc...
}
private static void method2() {
Logger logger = Logger.getLogger("org.examples.method2");
logger.debug("Hello from method2");
etc...
}

然后在我的log4j.properties文件中,我会激活这样的跟踪:

log4j.logger.org.examples.method1=debug
log4j.logger.org.examples.method2=debug
etc...

我试图在log4j v2中复制这种行为,但遇到了问题。

至于用记录器检测方法,我做得还可以。我用与v1相同的方式来做,只是我使用LogManager.getLogger((而不是Logger.getLogger(,它在v2中不存在(。

为了激活记录器,我需要使用v2语法,所以我现在这样做:

logger.app.name = org.examples.method1
logger.app.level = debug
logger.app.name = org.examples.method2
logger.app.level = debug

问题是,当我运行同时调用方法1和方法2的代码时,只会出现方法2的跟踪。为了查看method1跟踪,我必须注释掉method2属性。请注意,我已经尝试将additivity=true添加到两个记录器中,但没有效果。

Piotr(见下面的答案(说,我需要对上面代码中的".app"位有一个不同的值。所以我应该写这样的东西:

logger.1.name = org.examples.method1
logger.1.level = debug
logger.2.name = org.examples.method2
logger.2.level = debug

但这对我的用例来说真的很不方便,因为我必须:

  • 确保我在与给定记录器相关的所有行上使用相同的编号
  • 请确保我从不将相同的号码用于不同的记录器

一个解决方案是我编写一个宏,该宏将根据记录器的名称自动生成这两行。因此,对于一个名为org.examples.method1的记录器,它可能会生成:

logger.org_examples_method1.name = org.examples.method1
logger.org_examples_method1.level = debug

Pieter还建议我可以使用.yml或.json语法而不是.properties。但当我尝试.yml语法时,我遇到了同样的问题,即,如果我写这个:

Loggers:
logger:
- name: org.examples.method1
level: debug
logger:
- name: org.examples.method2
level: debug

然后只打印方法2记录道。在这里,似乎没有一个";第二id";涉及,所以我不确定如何修复它。

正如您所说,属性格式不是最容易使用的格式,因为它需要每个记录器至少行,并且需要生成大量无用的标识符。相比之下,您拥有:

  • 属性格式:
    logger.<id1>.name=org.example.foo
    logger.<id1>.level=INFO
    logger.<id2>.name=org.example.bar
    logger.<id2>.level=DEBUG
    
  • 以XML格式:
    <Loggers>
    <Logger name="org.example.foo" level="INFO"/>
    <Logger name="org.example.bar" level="DEBUG"/>
    </Loggers>
    
  • 以YAML格式:
    Loggers:
    logger:
    - name: org.example.foo
    level: INFO
    - name: org.example.bar
    level: DEBUG
    
  • JSON格式:
    "loggers": {
    "logger": [
    { "name": "org.example.foo", "level": "INFO" },
    { "name": "org.example.bar", "level": "DEBUG" }
    ]
    }
    

最近有一些主张旨在缩短属性格式:请参阅LOG4J2-3341、LOG4J2-3394或我自己的PR#735。

最新更新