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