如果在MyLogger类中创建静态Logger,则您将有一个Logger实例,其名称设置为MyLogger。当您从其他程序包中调用该记录器时,Log4j无法确定这些调用的来源,因为它们都使用相同的Logger。
最好的处理方法是在每个类中定义一个单独的Logger,但是如果您要使用一个类作为与Log4j的联系点,则可以执行以下 *** 作:
package com.daniel.logger;import org.apache.log4j.Logger;import com.daniel.package1.ClassA;import com.daniel.package2.ClassB;public class MyLogger{ public static void write(String message, Class<?> clazz){ Logger.getLogger(clazz).info(message); } public static void main(String[] args){ ClassA.log(); ClassB.log(); }}
然后,使用它的类之一可能类似于:
package com.daniel.package1;import com.daniel.logger.MyLogger;public class ClassA { public static void log(){ MyLogger.write("ClassA",ClassA.class); }}
而
log4j.properties文件看起来像:
log4j.appender.package1=org.apache.log4j.FileAppender log4j.appender.package1.File=package1.loglog4j.appender.package1.layout=org.apache.log4j.PatternLayoutlog4j.appender.package2=org.apache.log4j.FileAppenderlog4j.appender.package2.File=package2.loglog4j.appender.package2.layout=org.apache.log4j.PatternLayoutlog4j.logger.com.daniel.package1=DEBUG,package1log4j.logger.com.daniel.package2=DEBUG,package2
如果您不想通过ClassA传递Class,则可以使用带有反射的讨厌技巧,该技巧会获得调用类的名称,但是由于性能下降,我不建议这样做:
public class MyLogger{ public static void write(String message){ StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); Logger.getLogger(stackTraceElements[2].getClassName()).info(message); } public static void main(String[] args){ ClassA.log(); ClassB.log(); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)