如何使用同一log4j记录器为不同的程序包创建不同的日志文件?

如何使用同一log4j记录器为不同的程序包创建不同的日志文件?,第1张

如何使用同一log4j记录器为不同的程序包创建不同的日志文件?

如果在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();    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5479199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存