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

标签 java logging log4j

我正在尝试为不同的包设置单独的日志文件。我正在为 log4j 记录器使用 Wrapper 类。我的应用程序中的每个类都调用相同的包装类。我的包装类:

public class MyLogger
{
    private static Logger logger = Logger.getLogger(MyLogger.class.getName());
    ....
    ....
}

它是这样调用的:

MyLogger.write(, , );

有没有办法配置 log4j,使其将不同包的日志记录输出到不同的文件?

谢谢!

编辑:

这是我的 log4j.properties 文件:

log4j.rootLogger=DEBUG, infoout, aar
log4j.logger.com.businessservice.datapopulation=DEBUG, aar
log4j.additivity.com.businessservice.datapopulation=false

log4j.appender.infoout = org.apache.log4j.RollingFileAppender
log4j.appender.infoout.file=/app/aar_frontend.log
log4j.appender.infoout.append=true
log4j.appender.infoout.Threshold=DEBUG
log4j.appender.infoout.MaxFileSize=2MB
log4j.appender.infoout.MaxBackupIndex=10
log4j.appender.infoout.layout = org.apache.log4j.PatternLayout
log4j.appender.infoout.layout.ConversionPattern = %m%n

log4j.appender.aar = org.apache.log4j.RollingFileAppender
log4j.appender.aar.file=/app/aar/aar_backend.log
log4j.appender.aar.append=true
log4j.appender.aar.Threshold=DEBUG
log4j.appender.aar.MaxFileSize=2MB
log4j.appender.aar.MaxBackupIndex=10
log4j.appender.aar.layout = org.apache.log4j.PatternLayout
log4j.appender.aar.layout.ConversionPattern = %m%n

最佳答案

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

处理它的最佳方法是在每个类中定义一个单独的 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.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,您可以使用一个带有反射的讨厌技巧,它获取调用类的名称,但由于性能影响,我不建议这样做:

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

关于java - 如何使用相同的 log4j 记录器为不同的包创建不同的日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10630522/

相关文章:

c++ - 为事件记录系统设计(递归)记录对象

java - 如何在加载 log4j.xml 时记录异常

java - 如何记录 Jasper 报告(Log4j2.xml 配置)以进行调试?

java - 无法在Java中访问父级的 protected 方法

java - 如何在java中的 Elasticsearch Querybuilder中处理多个 'and' 'or'运算符

java - 一对一连接表级联删除

java - 递归数独求解器在 Java 中不起作用

linux - 将 linux 日志转换为 csv

java - 使用 log4j String 或 StringBuilder 打印日志哪个更有效

java - Log4j根据环境动态启用