【发布时间】:2020-08-10 10:06:58
【问题描述】:
我正在使用 log4j2。 我已经定义了多个记录器,所以我的 log4j2.xml 看起来像:
<Property name="LOG_PATTERN">[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</Property>
...
...
<Loggers>
<Logger name="trace" level="INFO" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="error" level="ERROR" additivity="false">
<AppenderRef ref="errorLog" />
</Logger>
<Logger name="warn" level="WARN" additivity="false">
<AppenderRef ref="warnLog" />
</Logger>
</Loggers>
然后我从代码中调用它们。片段:
Class myclass{
...
Logger LOGGER1 = LogManager.getLogger("trace");
Logger LOGGER2 = LogManager.getLogger("error");
...
LOGGER1.trace("whatever message");
我的问题是,据我所知,从代码调用记录器时,我可以从 log4j2.xml 中指定记录器。例如,如果我想使用“trace logger”,我可以编写 LogManager.getLogger("trace")
那么,“打印日志”时,%c{1} 不再是类名,而是记录器名... 在本例中,log4j2 将打印为 %c "trace" 而不是 "myclass"(这正是我想要的)。
我想知道,有没有可能:
- 选项 1. 调用具体记录器,同时打印“真实”类名 (不是在 getLogger 方法中作为参数传递的类名),
- 选项 2. 使用 gerLogger 方法中的类名和它们 将此记录器从代码映射到 log4j2.xml 中的记录器
提前感谢您的线索。
【问题讨论】:
-
通常使用类作为记录器名称是一个好习惯:
Logger logger = LogManager.getLogger(getClass());。