当前位置: 首页 > news >正文

Logger之Logger.getLogger(CLass)

之前一直在使用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()打印语句了.

相关文章:

  • 分享:Meteor 0.5.3 发布,Web 应用构建平台
  • Redhat6.5搭建ftp服务
  • cisco 端口映射
  • 编译型语言,解释型语言,混合型语言,静态类型语言、动态类型语言、动态语言、静态语言、强类型语言、弱类型语言...
  • 好文转载—六步创建一个安全的密码
  • gf框架之分页模块(五) - 自定义分页
  • SQL Server 2005 日常运维检查操作手册
  • FPGA设计中遇到的奇葩问题之“芯片也要看出身”(一)
  • UI自动化测试篇 :webdriver+ant+jenkins自动化测试实践
  • 再谈DOMContentLoaded与渲染阻塞—分析html页面事件与资源加载
  • mysql alter 曾删改查
  • jsonp
  • find_first_zore_bit-一个位图的实现
  • 素材锦囊——50个高质量的 PSD 素材免费下载《上篇》
  • Spark2.1.1spark写入Hbase的三种方法性能对比
  • 收藏网友的 源程序下载网
  • express.js的介绍及使用
  • iOS 系统授权开发
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Laravel Mix运行时关于es2015报错解决方案
  • laravel with 查询列表限制条数
  • react-native 安卓真机环境搭建
  • spring security oauth2 password授权模式
  • Vue全家桶实现一个Web App
  • vue学习系列(二)vue-cli
  • 反思总结然后整装待发
  • 分布式事物理论与实践
  • 记录:CentOS7.2配置LNMP环境记录
  • 记录一下第一次使用npm
  • 如何设计一个微型分布式架构?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 详解移动APP与web APP的区别
  • 新手搭建网站的主要流程
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #《AI中文版》V3 第 1 章 概述
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #预处理和函数的对比以及条件编译
  • (3)选择元素——(17)练习(Exercises)
  • (C语言)字符分类函数
  • (二)PySpark3:SparkSQL编程
  • (六)Hibernate的二级缓存
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net mvc 获取url中controller和action
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET Remoting学习笔记(三)信道
  • .NET成年了,然后呢?
  • .net访问oracle数据库性能问题
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET中使用Protobuffer 实现序列化和反序列化