在继承时声明slf4j实例的一个注意点

引言

java中的log组件有,log4j, commons-logging, slf4j等, 在声明的时候, 常见getClass()或者类名.class来做为名称, 这两种方法各有特色,整体来讲getClass()方便一些, 不过本人今天在继承中遇到了点微妙的差别, 在这里给你们分享下.java

代码

log4j代码:

<!-- lang: java --> 
log4j.rootLogger=info,CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

父类代码:

<!-- lang: shell -->
public class CreatorBase{

//方案一
// final private Logger logger = LoggerFactory.getLogger(getClass());

    //方案二 
// final private Logger logger = LoggerFactory.getLogger(CreatorBase.class);

    @Before
    public void setUp() throws Exception {
        //配置log4j
        logger.info("CreatorBase");
    }
}

子类代码:

<!-- lang: java -->
public class WorkerCreator extends CreatorBase{

    final private Logger logger = LoggerFactory.getLogger(getClass());

    @Test
    public void testCreateDB(){
        logger.info("Creating tables...");
    }
}

执行子类后的结果

本例采用log4j做为slf4j的实现类
方案一:
[WorkerCreator]-[INFO] CreatorBase
[WorkerCreator]-[INFO] Creating tables...
方案二:
[CreatorBase]-[INFO] CreatorBase
[WorkerCreator]-[INFO] Creating tables...shell

###问题总结### 在方案一中, 使用了getClass(), 被继承后, 在父类中却打印了子类的类名. 而方案二中使用类名.class,能够正确显示类名. 在本案例中是这个状况.
getClass()的好处是在ctrl+c, ctrl+v的时候很方便,不用改代码.
在方案二中的类名.class的方式, 每次ctrl+c, ctrl+v都须要修改类名.class, 容易遗忘搞错, 不过好处是在被继承的时候,防止出错.
结合实际状况, 来选择适合的写法.apache

相关文章
相关标签/搜索