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

尊重原创: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. Xamarin android SwipeRefreshLayout入门实例

    android SwipeRefreshLayout 是实现的效果就是上滑下拉刷新ListView 获取其他控件数据.基本上每个App都有这种效果.Google提供了一个官方的刷新控件SwipeRef ...

  2. ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集

    上节提及如何使用IDatasetContainer2接口访问到网络数据集,上例可以封装为一个方法. 这节就使用IDatasetContainer2接口(Geodatabase类库)的CreateDat ...

  3. Vuejs环境安装与工程建立【小白Windows向】

    不知道为什么CDN的方式就是困难...大佬说SPA必须配置本地开发环境,那就配咯. 所以就准备了以下的工具进行安装本地开发环境: 1. 代码编辑器×1[本人使用VSCode 1.11] 2. Node ...

  4. Python学习(五):易忘知识点

    1.列表比较函数cmp >>> a = [1,2,3,4] >>> b = [1,2,3,4,5] >>> c = [1,2,3,4] >& ...

  5. Java基础--二进制运算

    1. System.out.println((byte)0x8f); 结果是? 2.System.out.println((byte)(0xc5>>1)); 结果是? 3.System.o ...

  6. unity demo之坦克攻击

    先展示一下成果吧,节后第一天上班简直困爆了,所以一定要动下脑子搞点事情. 分析: 1.涉及到的游戏对象有:坦克,摄像机,场景素材(包含灯光),子弹 2.坦克具有的功能:移动,旋转,发射子弹,记录生命值 ...

  7. K:java中枚举的常见用法

    用法一:常量   在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...

  8. linux系统中,文件的三种特殊权限

    背景介绍 在linux系统中,我们熟知有rwx三种权限,对应所有者,同组用户,其他用户三种用户的权限,一共9个位来指定一个文件的权限情况,通过chmod xxx 来更改权限属性,其中xxx是已八进制表 ...

  9. H2Engine游戏服务器设计之属性管理器

    游戏服务器设计之属性管理器 游戏中角色拥有的属性值很多,运营多年的游戏,往往会有很多个成长线,每个属性都有可能被N个成长线模块增减数值.举例当角色戴上武器时候hp+100点,卸下武器时HP-100点, ...

  10. C#winform自定义控件模拟设计时界面鼠标移动和调节大小、选中效果

    要想玩转Winform自定义控件需要对GDI+非常熟悉,对常用的控件有一些了解,好选择合适的基类控件来简化. 要点说明及代码 1)定义接口: using System; using System.Wi ...