Java Log4j在基类中创建日志实例

Java Log4j在基类中创建日志实例,java,logging,log4j,Java,Logging,Log4j,假设层次结构中的所有类都只有默认构造函数,那么下面创建日志实例的问题是什么 public abstract class AbstractService { protected static Log log=null; public AbstractService(){ log=LogFactory.getLog(this.getClass().getName()); } public void foo(){

假设层次结构中的所有类都只有默认构造函数,那么下面创建日志实例的问题是什么

 public abstract class AbstractService {


    protected static Log log=null;


    public AbstractService(){
        log=LogFactory.getLog(this.getClass().getName());
    }

    public void foo(){      
        log.debug("base foo() : ");
    }

}


class ServiceA extends AbstractService {    

    public void foo(){
        super.foo();

        log.debug("Overloaded foo() in ServiceA");      
    }
}


class ServiceB extends AbstractService {
    public void foo(){
        super.foo();
        log.debug("Overloaded foo() in ServiceB");      

    }
} 
假设“log”字段是静态的(即与AbstractService类关联),则不应从构造函数(与该类的特定实例关联)设置它

您需要:

  • 使“log”字段非静态(可能是您想要的,因为您使用getClass().getName()对其进行命名),或者
  • 在声明中初始化它,例如受保护的静态日志Log=LogFactory.getLog(AbstractClass.class)
假设“log”字段是静态的(即与AbstractService类关联),则不应从构造函数(与该类的特定实例关联)中设置它

您需要:

  • 使“log”字段非静态(可能是您想要的,因为您使用getClass().getName()对其进行命名),或者
  • 在声明中初始化它,例如受保护的静态日志Log=LogFactory.getLog(AbstractClass.class)
我认为问题在于代码无法编译?我认为问题在于代码无法编译?1.如果我将其设置为非静态,它将为每个类创建新实例?(或者Log4j只引用与类名关联的同一个日志实例)?2.第二种方法,我只获取AbstractClass的日志。但是使用我的方法,日志记录会显示子类的名称。如果希望日志记录程序显示具体子类的名称,则必须使日志记录程序非静态,在这种情况下,任何此类类的每个实例都将有自己的日志实例。1.如果我使其非静态,它将为每个类创建新实例?(或者Log4j只引用与类名关联的同一个日志实例)?2.第二种方法,我只获取AbstractClass的日志。但是在我的方法中,日志记录显示子类的名称。如果您希望日志记录程序显示具体子类的名称,那么必须使日志记录程序非静态,在这种情况下,任何此类类的每个实例都将有自己的日志实例。