Logger之Logger.getLogger(Test.class)使用

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

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

[html] view plain copy
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
#日志级别,输出目的地
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
#日志级别,输出目的地
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

1
2
3
4
5
6
7
8
9
10
11
输出格式
log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n
新建一个测试类

[java] view plain copy
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!”);  
}  

}
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!");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
查看结果:

结合log4j.properties配置的
[html] view plain copy
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.lang.Object,简直就是误导.
这时候将LoggerTest类的代码修改

[java] view plain copy
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
/**

  • 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;
    }
    }
    /**

  • 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;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

修改类LoggerTest的代码:

[html] view plain copy
/**

  • 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!”);  
}  

}
/**

  • 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!");
}

}
1
2
3
4
5
6
7
8
9
10
11
运行结果:

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

发布了37 篇原创文章 · 获赞 8 · 访问量 5319

猜你喜欢

转载自blog.csdn.net/weixin_42714605/article/details/94008242