这样使用LOG4J有什么缺陷?


public class LogUtil {

private static Log LOG;

public static void trace(Object o) {

LOG = LogFactory.getLog(Reflection.getCallerClass(2));

LOG.trace(o);

}

public static void trace(String msg, Throwable error) {

LOG = LogFactory.getLog(Reflection.getCallerClass(2));

LOG.trace(msg, error);

}
public static void debug(Object o) {   
    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.debug(o);   
}   
public static void debug(String msg, Throwable error) {   
    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.debug(msg, error);   
}   

public static void info(Object o) {   
    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.info(o);   
}   
public static void info(String msg, Throwable error) {   
    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.info(msg, error);   
}   

public static void warn(Object o) {   
    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.warn(o);   
}   

public static void warn(String msg, Throwable error) {   
    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.warn(msg, error);   
}   

public static void error(Object o) {   

    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.error(o);   
}   
public static void error(String msg, Throwable error) {   
    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.error(msg, error);   
}   

public static void fatal(Object o) {   
    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.fatal(o);   
}   
public static void fatal(String msg, Throwable error) {   
    LOG = LogFactory.getLog(Reflection.getCallerClass(2));   
    LOG.fatal(msg, error);   
}   
}  


在具体的类中直接:
LogUtil.debug("");等等就OK了!
要是不想使用Log4j,Logger,直接修改LogUtil.java就可以了

但是我看别人一般是:
private static Logger log = Logger.getLogger(xxxx.class.getName());
log.debug();

这样写觉得比较麻烦!为什么每个类都要"private static Logger log = Logger.getLogger(xxxx.class.getName());"
??
要是不想使用Log4j,Logger,得修改每个类,去掉"private static Logger log = Logger.getLogger(xxxx.class.getName());" 太麻烦了!


我的那种使用方法有什么缺陷吗?

LogFactory.getLog(Reflection.getCallerClass(2));
你看看这端代码究竟会做什么
1、反射
2、LogFactory.getLog,是不是会做一些初始化等

我想性能是主要考虑吧

另外:
把log4j换掉的几率几乎为0吧

private static Log LOG;

public static void trace(Object o) {

LOG = LogFactory.getLog(Reflection.getCallerClass(2));

LOG.trace(o);

}
这种使用,并发下,会出问题吧

这么写,当你调用任意一个方法的时候LOG变量被反复赋值,是否会产生,日志的混乱呢,或者不产生混乱,而导致反复产生日志对象?
没有细想,你可以考虑一下。
如果仅仅是想要随时替换日志实现的话,commmon-log没准是个好选择

[code="java"]Reflection.getCallerClass(2)[/code]
在lz的LogUtil里面使用上面的代码取出的Class对象,是不是始终都是xxxx.Util?如果是这样的话,每次取出来的都是同一个logger吧?假设在log4j.xml里面根据包层次和使用场景配置了多个logger,如下,lz要如何单独的取出这两个不同的logger那?
[code="xml"]

...


...

[/code]

[quote]是不是始终都是xxxx.Util?[/quote]
写错了,是xxxx.LogUtil。

在每个方法里面加上if(log.isXXXEnabled)进行判断,此处XXX为Info,Error等,以便调整级别