• Logger之Logger.getLogger(CLass)技巧代替system.out.print


    ---恢复内容开始---

    尊重原创:http://www.cnblogs.com/zxf330301/p/5876117.html

    之前一直在使用System.out.println()来调试.但是用这种方式开发项目部署到生产环境,会因为众多的控制台输出降低应用的性能.这时候Log4J就成为可平衡开发和部署应用的利器了.

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

     
    1. private static Logger logger = Logger.getLogger(A.class);  
     private static Logger logger = Logger.getLogger(A.class);

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

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

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

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

    不过呢,问题不这么简单.首先要解决一个问题,Logger.getLogger(A.class)中的A.class有什么用?A.class可以不可以瞎写?

    先做个试验,先简单配置log4j.properties文件

    [html] view plain copy
     
    print?在CODE上查看代码片派生到我的代码片
    1. #日志级别,输出目的地  
    2. log4j.rootLogger=debug,stdout  
    3.   
    4. log4j.appender.stdout=org.apache.log4j.Conso  
    5. leAppender  
    6. log4j.appender.stdout.Target=System.out  
    7. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
    8. #输出格式  
    9. log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n  
    #日志级别,输出目的地
    log4j.rootLogger=debug,stdout
    
    log4j.appender.stdout=org.apache.log4j.Conso
    leAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    #输出格式
    log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n


    新建一个测试类

    [java] view plain copy
     
    print?在CODE上查看代码片派生到我的代码片
    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. }  
    import org.apache.log4j.Logger;
    
    /**
     * Created by li on 2015/5/24.
     */
    
    public class LoggerTest {
        private static Logger logger = Logger.getLogger(Object.class);
    
        public static void main(String[] args) {
            logger.debug("Hello World!");
        }
    }
    

    查看结果:

    结合log4j.properties配置的

    [html] view plain copy
     
    print?在CODE上查看代码片派生到我的代码片
    1. log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n  
    log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n

    不难知道%c这时候将LoggerTest类的代码修改

    [java] view plain copy
     
    print?在CODE上查看代码片派生到我的代码片
    1. private static Logger logger = Logger.getLogger(LoggerTest.class);  
    private static Logger logger = Logger.getLogger(LoggerTest.class);

    运行结果变为:

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

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

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

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

    看下面的代码:

    类Log4jUtils:

     

    [java] view plain copy
     
    print?在CODE上查看代码片派生到我的代码片
    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. }  
    /**
     * Created by li on 2015/5/23.
     */
    public class Log4JUtils{
    
        private static Logger logger =  null;
    
        public static Logger getLogger(){
           if (null == logger){
                //Java8 废弃了Reflection.getCallerClass()
               logger = Logger.getLogger(Reflection.getCallerClass().getName());
               logger.debug("调用者类名"+Reflection.getCallerClass().getName());
           }
            return logger;
        }
    }
    




    修改类LoggerTest的代码:

    [html] view plain copy
     
    print?在CODE上查看代码片派生到我的代码片
    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. }  
    /**
     * Created by li on 2015/5/24.
     */
    
    public class LoggerTest {
    //    private static Logger logger = Logger.getLogger(LoggerTest.class);
    
        public static void main(String[] args) {
            Log4JUtils.getLogger().debug("Hello World!");
        }
    }
    

    运行结果:


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

    ---恢复内容结束---

  • 相关阅读:
    ASP'禁止网页缓存,验证码生成,删除文件 iFileName 文件名 iPath 文件路径
    ASP.NET中如何防范SQL注入式攻击
    ThickBox 2.0
    ASP.NET用户控件也可以在Web.Config中进行引用
    SQL Server数据类型介绍
    CSS和JS标签style属性对照表
    Server.UrlEncode、HttpUtility.UrlDecode的区别[两篇文章]
    使用table数据类型变量获得临时表
    关闭页面JS兼容火狐_谷歌_IE6、7、8
    SQL语句实现两个数据库表直接操作
  • 原文地址:https://www.cnblogs.com/xiaohouzai/p/7538809.html
Copyright © 2020-2023  润新知