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

    1. private static Logger logger = Logger.getLogger(A.class);

    这样虽然简单,但是带来有两个问题:
    1.增加系统开销-每个使用Log4J的类都增加了对象属性.
    2.麻烦:每个使用Logger的类都要重复声明上面Logger对象.
    其实不难发现可以使用重构手法,声明一个公用的类Log4jUtils,处理Logger的公共操作.
    不过呢,问题不这么简单.首先要解决一个问题:
    Logger.getLogger(A.class)中的A.class有什么用?

    先做个试验,先简单配置log4j.properties文件,可参看这篇日志:log4j 配置详解

    1. #日志级别,输出目的地
    2. log4j.rootLogger=debug,stdout
    3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    4. log4j.appender.stdout.Target=System.out
    5. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    6. #输出格式
    7. 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. }

    结果:
    Log4j - Logger.getLogger(Class) 参数作用 - 图1

    结合log4j.properties配置的

    1. log4j.appender.stdout.layout.ConversionPattern=%c %d{ABSOLUTE} %5p %c{1}:%L - %m%n

    不难知道%c输出所属的类目,通常就是所在类(class)的全名。但是我们追踪的其实是LoggerTest类,结果返回的却是java.lang.Object,简直就是误导. 这时候将LoggerTest类的代码修改:

    1. private static Logger logger = Logger.getLogger(LoggerTest.class);


    结果变为:
    Log4j - Logger.getLogger(Class) 参数作用 - 图2
    要的结果终于出现了.至此,明白了getLogger(class)的参数用途:追踪产生此日志的类.

    新的问题:
    若要使用一个类Log4jUtils来专门处理Logger对象的声明等操作,那么如何处理getLogger(class)的参数问题?
    也就是如何在Log4jUtils得到调用logger对象的类型.

    解决这个困难可以是使用Java的反射机制
    看下面的代码:
    类Log4jUtils:

    1. public class Log4JUtils{
    2. private static Logger logger = null;
    3. public static Logger getLogger(){
    4. if (null == logger){
    5. //Java8 废弃了Reflection.getCallerClass()
    6. logger = Logger.getLogger(Reflection.getCallerClass().getName());
    7. logger.debug("调用者类名"+Reflection.getCallerClass().getName());
    8. }
    9. return logger;
    10. }
    11. }

    修改类LoggerTest的代码:

    1. public class LoggerTest {
    2. //private static Logger logger = Logger.getLogger(LoggerTest.class);
    3. public static void main(String[] args) {
    4. Log4JUtils.getLogger().debug("Hello World!");
    5. }
    6. }

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

    转载自:http://blog.csdn.net/lixwjava/article/details/45950559

    记:有空学习Reflection!