且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-01-10 17:57:46

如果在MyLogger类中创建静态Logger,那么你有一个Logger实例,名称设置为MyLogger。当您从其他软件包调用该记录器时,Log4j无法确定这些调用的来源,因为它们都使用相同的Logger。

If you create a static Logger within MyLogger class, then you have one Logger instance, with the name set to MyLogger. When you call that logger from other packages, Log4j is not able to determine the origin of those calls, as they all use the same Logger.

处理它的***方法,是要在每个类中定义一个单独的Logger,但是如果你想使用一个类作为Log4j的联系点,那么你可以这样做:

The best way to handle it, is to define a separate Logger within each class, but if you want to use one class as a point of contact with Log4j, then you can do this:

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

然后,使用它的一个类看起来像:

Then, one of the class using it could look like:

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.log
log4j.appender.package1.layout=org.apache.log4j.PatternLayout

log4j.appender.package2=org.apache.log4j.FileAppender
log4j.appender.package2.File=package2.log
log4j.appender.package2.layout=org.apache.log4j.PatternLayout

log4j.logger.com.daniel.package1=DEBUG,package1
log4j.logger.com.daniel.package2=DEBUG,package2

如果您不想从ClassA传递Class,您可以使用反射的讨厌技巧,获取调用类的名称,但由于性能损失,我不建议这样做:

If you don't want to pass the Class from ClassA, you could use a nasty trick with reflection, that gets the calling class' name, but I wouldn't recommend that due to a performance hit:

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