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

尊重原创: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文件

  1. #日志级别,输出目的地
  2. log4j.rootLogger=debug,stdout
  3. log4j.appender.stdout=org.apache.log4j.Conso
  4. leAppender
  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
#日志级别,输出目的地
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

新建一个测试类

  1. import org.apache.log4j.Logger;
  2. /**
  3. * Created by li on 2015/5/24.
  4. */
  5. public class LoggerTest {
  6. private static Logger logger = Logger.getLogger(Object.class);
  7. public static void main(String[] args) {
  8. logger.debug("Hello World!");
  9. }
  10. }
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配置的

  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类的代码修改

  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:

 

  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的代码:

  1. /**
  2. * Created by li on 2015/5/24.
  3. */
  4. public class LoggerTest {
  5. //    private static Logger logger = Logger.getLogger(LoggerTest.class);
  6. public static void main(String[] args) {
  7. Log4JUtils.getLogger().debug("Hello World!");
  8. }
  9. }
/**
* 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()打印语句了.

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

Logger之Logger.getLogger(CLass)技巧代替system.out.print的更多相关文章

  1. java中的 private Logger log=Logger.getLogger(this.getClass());

    this.getClass()得到什么? this 表示当前对象的引用: getClass() 是 java.lang.Object 中的方法,它返回一个对象的运行时类: this.getClass( ...

  2. Spring框架 (log4j :WARN No appenders could be found for logger log4j:WARN Please initialize the log4j system properly.)问题解决

    Spring框架需要的jar包 1.Spring压缩包中的四个核心JAR包 beans .context.core 和expression 下载地址: https://pan.baidu.com/s/ ...

  3. logger.debug,logger.info,logger.warn,logger.error,logger.fatal的区别

    logger.debug,logger.info,logger.warn,logger.error,logger.fatal的区别 logger.debug,logger.info,logger.wa ...

  4. 怎么在logcat中显示system.com.print中的打印信息

    在logcat中显示信息可以用Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 1.Log.v 的调试颜色为黑色的,任何消息都会输出: 2.Log.d的输出颜色是蓝 ...

  5. 电信SDK Pay函数里面System.out.print 无输出消息

    private void Pay(HashMap<String, String> payParams){ System.out.print("----------Pay Dian ...

  6. 关于System.out.println()与System.out.print("\n")的区别

    这是在写junit测试的时候发现的. import java.io.ByteArrayOutputStream; import java.io.PrintStream; public class Te ...

  7. Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log

    日常啰嗦 距离上一次更新博客有一段时间了,主要是因为最近有开发任务,另外,这段时间也在学习docker的相关知识,所以博客就没有继续写了,推荐一本书<Docker技术入门与实战>(第二版) ...

  8. python中print()函数的“,”与java中System.out.print()函数中的“+”

    python中的print()函数和java中的System.out.print()函数都有着打印字符串的功能. python中: print("hello,world!") 输出 ...

  9. System.out.print()执行顺序

    今天使用递归调用计算的时候发现一个很奇怪的问题 代码: public class practice20 { public static double nStep(double N) { if (N&l ...

随机推荐

  1. bzoj 2588 Count on a tree

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

  2. 8.nginx防DDOS

    配置详解,查看链接:http://www.myhack58.com/Article/60/sort096/2015/59453.htm 配置文件: http {         #白名单        ...

  3. Regular expressions in lexing and parsing(翻译)

    词法分析和语法分析中的正则表达式 (英文原文来自rob pike 的博客 https://commandcenter.blogspot.jp/2011/08/regular-expressions-i ...

  4. Cleaner, more elegant, and harder to recognize (msdn blog)

    It appears that some people interpreted the title of one of my rants from many months ago, "Cle ...

  5. Python安装和开发环境搭建

    1.官网:http://www.python.org/download/下载安装包,目前最新版本为3.6,安装包很多地方可以下,也可以在360软件管家上下载安装  特别要注意勾选:Add Python ...

  6. js跳转页面的几种方式

    第一种: window.location.href="http://www.baidu.com"; 第二种: window.history.back(-1); 第三种: windo ...

  7. 视觉SLAM的方案总结

    MoNoSLAM:https://github.com/hanmekim/SceneLib2 以扩展卡尔曼滤波为后端,追踪前端非常稀疏的特征点,以相机的当前状态和所有路标点为状态量,更新其均值和协方差 ...

  8. Mac说——关闭SIP

    今天在安装keras的时候总是提示numpy无法安装,百度了下,说是新版本的os系统加入了spi机制. 什么是SIP: 系统集成保护(System Integrity Protection,SIP), ...

  9. GIT的使用中的问题处理

    GIT 的常规操作 常规操作也是我自己平时常用的几个命令, 学自于 pro git 这本书中 git 配置文件 git的配置文件位置针对所有用户:/etc/gitconfig针对当前用户: -/.gi ...

  10. e.target和this的区别

    ```e.target与this的区别 event.target表示发生点击事件的元素this表示注册点击事件的元素 this 等于 e.currentTarget 指的是现在的目标this是所有原生 ...