log4j

来源:互联网 发布:访问网站出现 php探针 编辑:程序博客网 时间:2024/06/04 18:48

在项目中使用Log4J并不是一件困难的事情,简单粗暴的方式就是在每个类A中声明一个Logger私有属性

[html] view plain copy
  1. private static Logger logger = Logger.getLogger(A.class);  

这样虽然简单,但是带来有两个问题:

 1.增加系统开销-每个使用Log4J的类都增加了对象属性.

 2.麻烦:每个使用Logger的类都要重复声明上面Logger对象.

其实不难发现可以使用重构手法,声明一个公用的类Log4jUtils,处理Logger的公共操作.

不过呢,问题不这么简单.首先要解决一个问题:

Logger.getLogger(A.class)中的A.class有什么用?


先做个试验,先简单配置log4j.properties文件,可参看这篇日志:log4j 配置详解

[html] view plain copy
  1. #日志级别,输出目的地  
  2. log4j.rootLogger=debug,stdout  
  3.   
  4. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  5. log4j.appender.stdout.Target=System.out  
  6. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  7. #输出格式  
  8. log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n  

测试类:

[java] view plain copy
  1. import org.apache.log4j.Logger;  
  2.   
  3. /** 
  4.  * Created by li on 2015/5/24. 
  5.  */  
  6.   
  7. public class LoggerTest {  
  8.     private static Logger logger = Logger.getLogger(Object.class);  
  9.   
  10.     public static void main(String[] args) {  
  11.         logger.debug("Hello World!");  
  12.     }  
  13. }  

结果:


结合log4j.properties配置的
[html] view plain copy
  1. log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n  
不难知道%c输出所属的类目,通常就是所在类(class)的全名。但是我们追踪的其实是LoggerTest类,结果返回的却是java.lang.Object,简直就是误导.这时候将LoggerTest类的代码修改:

[java] view plain copy
  1. private static Logger logger = Logger.getLogger(LoggerTest.class);  

结果变为:

要的结果终于出现了.至此,明白了getLogger(class)的参数用途:追踪产生此日志的类.


新的问题:

若要使用一个类Log4jUtils来专门处理Logger对象的声明等操作,那么如何处理getLogger(class)的参数问题?

也就是如何在Log4jUtils得到调用logger对象的类型.


解决这个困难可以是使用Java的反射机制

看下面的代码:

类Log4jUtils:

[java] view plain copy
  1. /** 
  2.  * Created by li on 2015/5/23. 
  3.  */  
  4. public class Log4JUtils{  
  5.   
  6.     private static Logger logger =  null;  
  7.   
  8.     public static Logger getLogger(){  
  9.        if (null == logger){  
  10.             //Java8 废弃了Reflection.getCallerClass()  
  11.            logger = Logger.getLogger(Reflection.getCallerClass().getName());  
  12.            logger.debug("调用者类名"+Reflection.getCallerClass().getName());  
  13.        }  
  14.         return logger;  
  15.     }  
  16. }  
修改类LoggerTest的代码:

[html] view plain copy
  1. /**  
  2.  * Created by li on 2015/5/24.  
  3.  */  
  4.   
  5. public class LoggerTest {  
  6. //private static Logger logger = Logger.getLogger(LoggerTest.class);  
  7.   
  8.     public static void main(String[] args) {  
  9.         Log4JUtils.getLogger().debug("Hello World!");  
  10.     }  
  11. }  
运行结果:


看到这个结果就很爽了.以后项目就可以放弃使用System.out.println()打印语句了.


转载自:http://blog.csdn.net/lixwjava/article/details/45950559


记:有空学习Reflection!


原创粉丝点击