【问题标题】:log4j2 class name when using multiple loggers besides root使用除 root 之外的多个记录器时的 log4j2 类名
【发布时间】: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());

标签: java logging log4j2


【解决方案1】:

在 log4j2.xml 文件中,当定义日志模式时,您可以使用两个不同的东西:“c”(小写)和“C”(大写)。

  1. “c”将作为记录器名称记录,并且
  2. “C”将被记录为创建记录器的类(执行 %M 的类)。

包括第二个的可能模式如下所示:

&lt;Property name="LOG_PATTERN"&gt;[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%C][%M] - %msg%n&lt;/Property&gt;

更多信息在这里:http://logging.apache.org/log4j/2.x/manual/usage.html#LoggerVsClass

反正https://stackoverflow.com/users/1709216/rgoers之前提出的文章都是金矿。

【讨论】:

    【解决方案2】:

    您的问题听起来好像您还没有阅读 log4j 文档或阅读任何有关如何使用它的文章。特别是您应该查看:

    【讨论】:

    【解决方案3】:
    <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 - 用于输出发出日志请求的调用者的全限定类名。例如,对于类名“org.apache.xyz.SomeClass”,模式 %C{1} 将输出“SomeClass”。

    【讨论】:

      猜你喜欢
      • 2015-06-01
      • 2018-02-26
      • 2014-11-25
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多