Java 如何使用相同的log4j记录器为不同的包创建不同的日志文件?
我正在尝试为不同的包设置单独的日志文件。我正在为Java 如何使用相同的log4j记录器为不同的包创建不同的日志文件?,java,logging,log4j,Java,Logging,Log4j,我正在尝试为不同的包设置单独的日志文件。我正在为log4j记录器使用包装器类。我的应用程序中的每个类都调用相同的包装器类。我的包装器类: public class MyLogger { private static Logger logger = Logger.getLogger(MyLogger.class.getName()); .... .... } 这就是所谓的: MyLogger.write(, , ); 是否有办法配置log4j,以便将不同包的日志记录输出
log4j
记录器使用包装器类。我的应用程序中的每个类都调用相同的包装器类。我的包装器类:
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
您可以这样做(com.myco.a和com.myco.b是您的两个不同包):
干杯。创建2个附加器和2个记录器可以满足您的需要。如果您在MyLogger类中创建一个静态记录器,那么您就有一个记录器实例,名称设置为MyLogger。当您从其他包调用该记录器时,Log4j无法确定这些调用的来源,因为它们都使用相同的记录器 处理它的最佳方法是在每个类中定义一个单独的记录器,但是如果您想使用一个类作为与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();
}
}
而log4j.properties
文件如下所示:
package com.daniel.package1;
import com.daniel.logger.MyLogger;
public class ClassA {
public static void log(){
MyLogger.write("ClassA",ClassA.class);
}
}
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传递类,您可以使用一个带有反射的讨厌的技巧,即获取调用类的名称,但由于性能受到影响,我不建议这样做:
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();
}
}
从属性文件中读取每个包所需的自定义文件位置。然后,您可以使用以下给定的方法更新log4j prop文件中设置的log4j文件位置:
private void updateLog4jConfiguration(String logFile) {
java.util.Properties properties = new Properties();
try {
InputStream configStream = getClass().getResourceAsStream( "/log4j.properties");
properties.load(configStream);
configStream.close();
}
catch (IOException e) {
System.out.println("Error: Cannot laod configuration file ");
}
properties.setProperty("log4j.appender.FILE.file", logFile);
org.apache.log4j.LogManager.resetConfiguration();
org.apache.log4j.PropertyConfigurator.configure(properties);
}
无法使用单个
记录器?在代码中是否使用相同的记录器?您应该在每个类中创建一个记录器。我在所有应用程序中使用相同的包装器记录器类。问题中也提到了。如果您必须使用包装类,请使用SLF4j或log4j提供的包装类,请查看他们的api,它使用起来很简单,但性能不太好。Log4j需要始终在两个文件之间切换,关闭其中一个文件的流并打开另一个文件。谢谢!。请再问一个问题:我是否可以(用java)检查log4j的配置文件中是否定义了特定类的appender?
private void updateLog4jConfiguration(String logFile) {
java.util.Properties properties = new Properties();
try {
InputStream configStream = getClass().getResourceAsStream( "/log4j.properties");
properties.load(configStream);
configStream.close();
}
catch (IOException e) {
System.out.println("Error: Cannot laod configuration file ");
}
properties.setProperty("log4j.appender.FILE.file", logFile);
org.apache.log4j.LogManager.resetConfiguration();
org.apache.log4j.PropertyConfigurator.configure(properties);
}