web-dev-qa-db-fra.com

Comment créer différents fichiers journaux pour différents packages en utilisant le même enregistreur log4j?

J'essaie de configurer des fichiers journaux distincts pour différents packages. J'utilise une classe Wrapper pour un enregistreur log4j. Chaque classe de mon application appelle la même classe wrapper. Mon cours de wrapper:

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

Cela s'appelle comme ça:

MyLogger.write(, , );

Y a-t-il un moyen de configurer log4j pour qu'il enregistre la journalisation de différents packages dans différents fichiers?

Merci!

Modifier:

Voici mon fichier 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
12
HashimR

Si vous créez un enregistreur statique dans la classe MyLogger, vous disposez d'une instance d'enregistreur, avec le nom défini sur MyLogger. Lorsque vous appelez cet enregistreur à partir d'autres packages, Log4j n'est pas en mesure de déterminer l'origine de ces appels, car ils utilisent tous le même enregistreur.

La meilleure façon de le gérer est de définir un journal distinct dans chaque classe, mais si vous souhaitez utiliser une classe comme point de contact avec Log4j, vous pouvez le faire:

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

Ensuite, l’une des personnes utilisant cette classe pourrait ressembler à ceci:

package com.daniel.package1;

import com.daniel.logger.MyLogger;

public class ClassA {

    public static void log(){
        MyLogger.write("ClassA",ClassA.class);
    }
}

Et le fichier log4j.properties ressemblerait à ceci:

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

Si vous ne voulez pas passer la classe de ClassA, vous pouvez utiliser une astuce avec réflexion, qui donne le nom de la classe appelante, mais je ne le recommanderais pas en raison d'un problème de performances:

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

Lisez l'emplacement du fichier personnalisé requis dans un fichier de propriétés ou ainsi pour chaque package. Ensuite, vous pouvez utiliser la méthode donnée ci-dessous pour mettre à jour l’emplacement du fichier log4j défini dans le fichier 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); 
}
0
Shamli

Vous pouvez le faire comme ça (com.myco.a et com.myco.b étant vos 2 packages différents):

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

À votre santé.

0
Philippe

Créer 2 appenders et 2 loggers ferait ce que vous voulez.

0
Kuldeep Jain