14

パッケージごとに別々のログファイルを設定しようとしています。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
4

4 に答える 4

7

MyLoggerクラス内に静的ロガーを作成する場合、名前がMyLoggerに設定された1つのロガーインスタンスがあります。他のパッケージからそのロガーを呼び出す場合、それらはすべて同じロガーを使用するため、Log4jはそれらの呼び出しの発信元を判別できません。

これを処理する最良の方法は、各クラス内に個別のロガーを定義することですが、Log4jとの接点として1つのクラスを使用する場合は、次のようにすることができます。

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

次に、それを使用するクラスの1つは次のようになります。

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();
    }
}
于 2012-05-17T07:15:25.373 に答える
1

あなたはそのようにこれを行うことができます(com.myco.aとcom.myco.bはあなたの2つの異なるパッケージです):

log4j.logger.com.myco.a=DEBUG, infoout 
log4j.logger.com.myco.b=DEBUG, aar 

乾杯。

于 2012-05-17T06:58:23.850 に答える
0

2つのアペンダーと2つのロガーを作成すると、必要な処理が実行されます。

于 2012-05-17T07:04:07.100 に答える
0

各パッケージのプロパティファイルなどから、必要なカスタムファイルの場所を読み取ります。次に、以下の方法を使用して、log4jpropファイルに設定されている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); 
}
于 2012-05-17T07:19:29.997 に答える