SLF4J / LOG4J:在log-utility类中使用提供的logger

时间:2014-05-19 07:33:32

标签: java logging log4j slf4j

对于一些复杂的日志记录任务,我有一个Utility类来构建日志条目(一些有多行)。我正在使用(log4j)ConversionPattern:

<param name="ConversionPattern" value="[%5p] %C{1}-%L: %m%n" />

这是一个简化的例子:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class UtilityClass
{
  private final static Logger logger = LoggerFactory.getLogger(UtilityClass.class);

  public static void test(Logger mainLogger, Class<?> c)
  {
    logger.info("Log from UtilClass with UtilClass-Logger");
    mainLogger.info("Log from UtilClass with MainClass-Logger");

    Logger log = LoggerFactory.getLogger(c);
    log.info("buildLogger");
  }
}

现在是MainClass

private final static Logger logger = LoggerFactory.getLogger(MainClass.class);
public void testLogger()
{   
  logger.info("Log from MainClass");
  UtilityClass.test(logger,this.getClass());
}

我得到了这个输出,并想知道为什么第三行来自UtilityClass。

[ INFO] MainClass-28: Log from MainClass
[ INFO] UtilityClass.test-12: Log from UtilClass with UtilClass-Logger
[ INFO] UtilityClass.test-13: Log from UtilClass with MainClass-Logger     <--------
[ INFO] UtilityClass.test-16: buildLogger

嗯,当然这正是调用记录器的地方。但是,即使在UtilityClass中调用了记录器,是否可以将调用类(此处为MainClass)的信息传递给日志条目? 我想得到这样的东西:

[ INFO] MainClass-28: Log from MainClass
[ INFO] UtilityClass.test-12: Log from UtilClass with UtilClass-Logger
[ INFO] MainClass-29: Log from UtilClass with MainClass-Logger     <--------
[ INFO] MainClass-29: buildLogger                                  <--------

1 个答案:

答案 0 :(得分:0)

因为记录器显示了调用它的位置。当您使用:

实例化时
LoggerFactory.getLogger(xxx);

xxx只是您可以在xml / property文件中配置的记录器的名称

例如:

配置

log4j.logger.ONE = INFO
log4j.logger.TWO = DEBUG.

<强>代码

a = LoggerFactory.getLogger("ONE");
b = LoggerFactory.getLogger("TWO");

因此,a.debug未出现在日志中,因为您将日志记录级别配置为INFO。但当它显示任何内容时,它会显示调用它的位置。