log4j2 class 使用除 root 之外的多个记录器时的名称
log4j2 class name when using multiple loggers besides root
我正在使用 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 指定记录器。例如,如果我想使用“跟踪记录器”,我会编写代码 LogManager.getLogger("trace")
然后,当“打印日志”时,%c{1} 不再是类名,而是记录器名称...
在此示例中,log4j2 将打印为 %c“trace”而不是“myclass”(这正是我想要的)。
我想知道,是否可以:
- 选项 1. 调用具体记录器,同时打印“真实”类名
(不是在 getLogger 方法中作为参数传递的类名),
- 选项 2. 在 gerLogger 方法和它们中使用类名
将此记录器从代码映射到 log4j2.xml
的记录器
提前感谢您提供的线索。
你的问题听起来好像你没有阅读 log4j 文档或阅读任何关于如何使用它的文章。您尤其应该查看:
- Log4j 2 Architecture
- Log4j 2 Configuration - 特别是记录器部分
- Pattern Layout - 请参阅 class、文件、方法、行和位置转换模式。
- Articles
在 log4j2.xml 文件中,定义日志模式时可以使用两种不同的东西:“c”(小写)和“C”(大写)。
- “c”将作为记录器名称记录,并且
- “C”将记录为创建记录器的 class(class 执行 %M 的位置)。
包括第二个在内的可能模式如下所示:
<Property name="LOG_PATTERN">[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%C][%M] - %msg%n</Property>
更多信息在这里:http://logging.apache.org/log4j/2.x/manual/usage.html#LoggerVsClass
总之,https://whosebug.com/users/1709216/rgoers之前提出的文章,真是个金矿
<Property name="LOG_PATTERN">[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%C][%M] - %msg%n</Property>
c - 用于输出日志事件的类别。例如,对于类别名称“a.b.c”,模式 %c{2} 将输出“b.c”。
C - 用于输出发出日志请求的调用者的完全限定 class 名称。例如,对于 class 名称“org.apache.xyz.SomeClass”,模式 %C{1} 将输出“SomeClass”。
我正在使用 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 指定记录器。例如,如果我想使用“跟踪记录器”,我会编写代码 LogManager.getLogger("trace")
然后,当“打印日志”时,%c{1} 不再是类名,而是记录器名称... 在此示例中,log4j2 将打印为 %c“trace”而不是“myclass”(这正是我想要的)。
我想知道,是否可以:
- 选项 1. 调用具体记录器,同时打印“真实”类名 (不是在 getLogger 方法中作为参数传递的类名),
- 选项 2. 在 gerLogger 方法和它们中使用类名 将此记录器从代码映射到 log4j2.xml 的记录器
提前感谢您提供的线索。
你的问题听起来好像你没有阅读 log4j 文档或阅读任何关于如何使用它的文章。您尤其应该查看:
- Log4j 2 Architecture
- Log4j 2 Configuration - 特别是记录器部分
- Pattern Layout - 请参阅 class、文件、方法、行和位置转换模式。
- Articles
在 log4j2.xml 文件中,定义日志模式时可以使用两种不同的东西:“c”(小写)和“C”(大写)。
- “c”将作为记录器名称记录,并且
- “C”将记录为创建记录器的 class(class 执行 %M 的位置)。
包括第二个在内的可能模式如下所示:
<Property name="LOG_PATTERN">[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%C][%M] - %msg%n</Property>
更多信息在这里:http://logging.apache.org/log4j/2.x/manual/usage.html#LoggerVsClass
总之,https://whosebug.com/users/1709216/rgoers之前提出的文章,真是个金矿
<Property name="LOG_PATTERN">[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%C][%M] - %msg%n</Property>
c - 用于输出日志事件的类别。例如,对于类别名称“a.b.c”,模式 %c{2} 将输出“b.c”。
C - 用于输出发出日志请求的调用者的完全限定 class 名称。例如,对于 class 名称“org.apache.xyz.SomeClass”,模式 %C{1} 将输出“SomeClass”。