java - log4j:当我从另一个类调用记录器时,日志中显示的类名不正确

标签 java logging log4j

基本上,当使用 log4j 时,我知道我们必须使用 Logger.getLogger(MyClass.class) 或 Logger.getLogger("MyClass") 来启动 Logger。

我有太多的类,我不想在每个类中添加这个语句。相反,我想做的是这个

Logger.info(this,"My message");

其中 Logger 是我编写的一个类(不是 log4j 中的类),它依次启动 Logger 类型的对象 (org.apache.log4j.Logger) 并继续处理消息。

这是我的 Logger.java

package com.mypackage;

/**
 * @author Sriram Sridharan
 *Custom logging implementation using log4j
 */
public class Logger {
private static org.apache.log4j.Logger logger;

    /**
     * Writes an INFO log
     * @param oClass
     * @param message
     */
    public static void INFO(Object oClass, String message){

org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(oClass.getClass());
    logger.info(message);
}
}

现在,我有自己的类,它调用此 Logger 实现来记录事件。看起来像这样

public class MyClass {

    public void myMethod(){
        com.mypackage.Logger.INFO(this, "Hello, World");
    }
}

我的日志没有问题。他们很好。但是,日志中显示的类名称是相同的(Logger)。这是输出

 INFO [main] (Logger.java:18) - Hello, World

我期待这个

 INFO [main] (MyClass.java:18) - Hello, World

我哪里出错了?

最佳答案

使用%c模式输出类别/getLogger("myCategory")/而不是打印调用者类的%C

这个想法是你有通用方法:

public static void debug(String category, String message) {
    Logger logger = org.apache.log4j.Logger.getLogger(category);
    logger.debug(message);
}

并且您的 log4j 配置包含您的模式:

%d{ISO8601} %c %m %n

这将打印

2014-02-21 14:38:120 YourCategory Your Message

因此,您无需为每个带有日志的类设置 Logger。

关于java - log4j:当我从另一个类调用记录器时,日志中显示的类名不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21935367/

相关文章:

java - 使用 logback,但不知何故 log4j 被初始化

grails - Grails测试log.debug或println以使输出不与-echoOut一起使用

java - HttpServletRequest.getSession(false) 和 HttpSession 的区别

java - 获取整棵树的 JPA 查询

java - 如何使用 slf4j 读取 .properties 文件?

java - 将 Log4j 输出写入 HDFS

java - 更改 Java 类加载器的优先级

Java "&"运算符

没有 XML 的 Java Spring 拦截器

Python:警告和日志记录详细限制