之前一直在使用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. private static Logger logger =  null;
  6. public static Logger getLogger(){
  7. if (null == logger){
  8. //Java8 废弃了Reflection.getCallerClass()
  9. logger = Logger.getLogger(Reflection.getCallerClass().getName());
  10. logger.debug("调用者类名"+Reflection.getCallerClass().getName());
  11. }
  12. return logger;
  13. }
  14. }
/**
* 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)的更多相关文章

  1. 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 ...

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

    ---恢复内容开始--- 尊重原创:http://www.cnblogs.com/zxf330301/p/5876117.html 之前一直在使用System.out.println()来调试.但是用 ...

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

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

  4. Logger.getLogger()和LogFactory.getLog()的区别

    第一.Logger.getLogger()和LogFactory.getLog()的区别 1.Logger.getLogger()是使用log4j的方式记录日志: 2.LogFactory.getLo ...

  5. java中Logger.getLogger(Test.class)

    java中Logger.getLogger(Test.class) log4的使用方法: log4是具有日志记录功能,主要通过一个配置文件来对程序进行监测有两种配置方式:一种程序配置,一种文件配置有三 ...

  6. java中Logger.getLogger(Test.class),即log4日志的使用

    log4的使用方法: log4是具有日志记录功能,主要通过一个配置文件来对程序进行监测有两种配置方式:一种程序配置,一种文件配置有三个主要单元要了解,Logger,appender,layout. l ...

  7. Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

    Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合   第一.Logger.getLogger()和Log ...

  8. org.apache.log4j.Logger详解

    org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...

  9. Java程序日志:java.util.logging.Logger类

    一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...

随机推荐

  1. 纠结的CLI C++与Native C++的交互

    最近在写点东西,涉及到了CLR C++与Native C++的互相调用的问题,结果...........纠结啊. 交互原型 交互原型是这样的: void* avio_alloc_context( un ...

  2. Hard 不用+号实现两个数之和 @CareerCup

    例子: 759+674 1)不考虑进位:   323 2)只考虑进位:1110 3)两者之和:1433 递归求解c package Hard; /** * Write a function that ...

  3. Hard 计算0到n之间2的个数 @CareerCup

    一种是Brute force,O(nlogn) 另一种是找规律O(n),见http://hawstein.com/posts/20.4.html 当某一位的数字小于2时,那么该位出现2的次数为:更高位 ...

  4. android.view.WindowLeaked解决办法

    08-07 14:51:28.129: E/WindowManager(22277): Activity com.xxx.xxx.xxx.xxx.LoginActivity has leaked wi ...

  5. floyd+动态规划 hdu-4571-Travel in time

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4571 题目大意: 有n个景点,每个点都有个游玩时间ci,游玩后得到的满意度si.给一个起点s和终点e ...

  6. JavaScript和prototype

    Protoype这个词在javascript中可以有两种理解: 第一种是作为javascript中的一个属性,其一般出现的形式为:类名.prototype. prototype 属性让你有能力向对象添 ...

  7. PHP安全编程:留心后门URL 直接可以通过URL访问(转)

    后门URL是指虽然无需直接调用的资源能直接通过URL访问.例如,下面WEB应用可能向登入用户显示敏感信息: <?php $authenticated = FALSE; $authenticate ...

  8. 图片预览(base64和blob:图片链接)和ajax上传、下载(带进度提示)

    直接上代码 html和js <!DOCTYPE html> <html> <head> <meta name="viewport" con ...

  9. SGU 199 - Beautiful People 最长上升子序列LIS

    要邀请n个人参加party,每个人有力量值strength Si和魅力值 beauty Bi,如果存在两人S i ≤ S j and B i ≥ B j 或者  S i ≥ S j and B i ≤ ...

  10. HDU 5033 Building(单调栈维护凸包)

    盗张图:来自http://blog.csdn.net/xuechelingxiao/article/details/39494433 题目大意:有一排建筑物坐落在一条直线上,每个建筑物都有一定的高度, ...