我试图设立单独的日志文件不同的包。 我使用的包装类的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
如果创建MyLogger类中的一个静态的记录器,那么你有一个Logger实例,设置为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();
}
}
然后,使用它可能看起来像类中的一种:
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的类,你可以使用与反射下流的手段,是可以获得调用类的名字,但我不会建议,由于性能损失:
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();
}
}
你可以这样做那样(com.myco.a和com.myco.b是你的2个不同的包):
log4j.logger.com.myco.a=DEBUG, infoout
log4j.logger.com.myco.b=DEBUG, aar
干杯。
阅读从属性文件或因此每个包所需的自定义文件的位置。 然后,你可以使用如下方法来更新log4j的文件位置在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);
}
文章来源: How to create different log files for different packages using same log4j logger?