当前位置: 首页 > 面试题库 >

使用log4j包装器在日志语句中打印“ source”类

申屠乐池
2023-03-14
问题内容

我的应用程序有一个自制的日志记录类,我将在后台使用log4j进行迁移。但是,由于我正在使用homebrew类将应用程序的其余日志记录语句传递给log4j,因此输出语句被记录为来自包装类而不是源类。

除了为每个log语句创建新的org.apache.log4j.Logger实例之外,是否有办法确保显示“正确的”源?我也尝试过使用Logger.log(String
callerFQCN,Priority level,Object message,Throwable t)方法,但是它似乎不起作用,例如:

public class Logger2 {

    public static org.apache.log4j.Logger log4JLogger = org.apache.log4j.Logger.getLogger(Logger2.class);

    public static void warning(Object source, String message) {

        log(source, message, Level.WARN, null)
    }

    private static void log(Object source, String message, Level level, Throwable t) {

        String className = source.getClass().getName();
        System.out.println("Logging class should be " + className);
        log4JLogger.log(className, loggingLevel, message, t);
    }
}

当调用者:

public void testWarning() {
    Logger2.warning(new Integer(3), "This should warn");
}

印刷品:

Logging class should be java.lang.Integer
2010-05-25 10:49:57,152 WARN                              test.Logger2 - This should warn

问题答案:

我自制的日志记录解决方案使用log4j的LocationInfo类查找源代码信息。

使用此解决方案,该locationInfo对象包含来自该对象的信息,该信息使用调用我的记录器loggerName

这是使用log4j记录的我的记录器的简化版本:

public void log(Level level, String message) {
    LocationInfo locationInfo = new LocationInfo(new Throwable(),
            loggerName);

    MDC.put(LINE_NUMBER, locationInfo.getLineNumber());
    MDC.put(FILE_NAME, locationInfo.getFileName());
    MDC.put(CLASS_NAME, locationInfo.getClassName());
    MDC.put(METHOD_NAME, locationInfo.getMethodName());
    MDC.put(FQMETHOD_NAME, locationInfo.getClassName() + "."
            + locationInfo.getMethodName());

    logger.log(level, message);

    MDC.remove(LINE_NUMBER);
    MDC.remove(FILE_NAME);
    MDC.remove(CLASS_NAME);
    MDC.remove(METHOD_NAME);
    MDC.remove(FQMETHOD_NAME);
}

顺便说一句:Level,MDC和Logger类都是log4j类。

回复评论:

MDC对象存储在该ThreadLocal对象上,并且可供log4j记录器访问。

从MDC Java文档中:

MDC基于每个线程进行管理。



 类似资料:
  • 当我在Wildfly10上部署war时,Log4j日志不会打印。1.0.最终的不过,它与Tomcat配合得很好。 我在网上发现Wildfly使用log4j,所以我在jboss部署结构中排除了log4j。下面的xml避免了依赖冲突,但没有运气。 下面是我log4.properties档案 下面是我的pom。xml依赖关系 下面是我部署战争时得到的错误日志。 我正在尝试运行独立的完整ha。xml

  • 环境:Java、Selenium webdriver、Maven、testNG、Log4J、Eclipse XML 我添加了log4j。src/main/resources下的属性。 在基本测试中。java,我在导入log4j后添加了两行。 日志信息(“方法设置”); 日志信息(“方法拆除”); 我的目标是能够使用日志。了解整个项目。在此之前,我只想通过在basetest类中导入log4j log

  • 我有一个java项目,它使用log4j作为记录器。要求在日志文件中打印测试用例名称。 一个类中有多个测试,该项目也支持并行执行。为每个测试创建一个记录器实例。 我使用system. Setproprty将我当前的记录器实例与测试用例名称相关联。以下是我的log4j.properties文件:- 并在创建logger文件的新实例时设置运行时变量${testCaseName},如下所示:- 上面的lo

  • 当我将应用程序运行到容器中时,我可以看到以下输出: Docker日志 现在,从docker实例中,我只看到“stdout”: root@3acd2bd90da4:/usr/src/app#./bin/run.sh 它错过了docker日志命令中以Traceback(stderr)开头的错误部分 当我在容器中运行命令时,我能做些什么来打印所有的日志? 谢啦

  • 当我运行这段代码时,没有任何东西被打印到控制台。我应该如何使用logp?

  • 我在记录调用类的类名时遇到问题。我在logback中编写了日志实用程序类。出于性能原因,我使用单例模式创建了记录器实用程序。但是,当我从其他类调用日志语句时,我会打印实用工具的类名,而不是调用类。 测试课就像 我得到的输出如下打印而不是LogUtilTest,我需要帮助记录我的调用类名 2014-04-14 16:47:21信息[main]MyModule[LogUtil.info:42]类名[c