web-dev-qa-db-fra.com

Comment donner un nom de fichier dynamique dans l'appender dans log4j.xml

J'utilise log4j pour enregistrer les informations. J'ai utilisé un fichier log4j.xml pour créer des fichiers journaux. J'ai donné le chemin absolu de chaque fichier journal sous la forme d'une valeur de variable param.

Par exemple.:

<appender name="FA" class="org.Apache.log4j.DailyRollingFileAppender">
  <param name="DatePattern" value="'_'yyyyMMdd"/>
  <param name="File" value="D:/logFiles/GPreprocessor.log"/>
  <layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/>
</appender>

Je ne veux pas écrire "GPreprocessor.log" directement. En fait, ce nom de fichier est dynamique, basé sur le nom de mon projet. Par exemple, si j'exécute le programme ABC.Java, la journalisation doit aller à D:/logFiles/ABC.log, mais si j'exécute XYZ.Java, la journalisation doit être à D:/logFiles/XYZ.log. L'emplacement du fichier restera toujours le même: D:/logFiles/. Comment modifier le nom du fichier journal de manière dynamique?

19
Bittu

C'est beaucoup plus facile de faire ce qui suit:

Dans log4j.xml, définissez la variable en tant que $ {variable}:

<appender name="FILE" class="org.Apache.log4j.FileAppender">    
    <param name="File" value="${logfilename}.log" />
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d::[%t]::%-5p::%c::%x - %m%n" />
    </layout>       
</appender>

Assurez-vous ensuite de définir la propriété système lorsque vous démarrez votre machine virtuelle Java, par exemple:

Java -Dlogfilename=my_fancy_filename  example.Application

Cela créera un nom de fichier journal dynamique: my_fancy_filename.log

Sinon, vous pouvez définir la propriété système dans le code aussi longtemps que vous le faites avant de créer un enregistreur (cela est utile si vous souhaitez que votre PID dans vos journaux, par exemple). Tel que:

System.setProperty("logfilename", "a_cool_logname");

Une fois que cela est défini, vous pouvez aller de l'avant et obtenir vos enregistreurs comme d'habitude et ils se connecteront au fichier dynamique (faites attention à ces enregistreurs statiques qui créent des enregistreurs avant que votre méthode principale ne soit exécutée).

74
Big B

Vous trouverez ci-dessous le code pour utiliser Log4J pour générer dynamiquement le nom de fichier . Il change de nom en fonction du nom du fichier d'entrée et de la date/heure actuelle. (Très utile si vous exécutez plusieurs fois le même fichier.)

public class LogClass {

    private static Logger log =  Logger.getLogger(LogClass.class);
    private static boolean initializationFlag = false;
    private static String fileName;

    private static void intializeLogger(){
        log.setLevel(Level.DEBUG);

        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        Date date = new Date();

        RollingFileAppender appender = new RollingFileAppender();
        appender.setAppend(true);
        appender.setMaxFileSize("1MB");
        appender.setMaxBackupIndex(1);
        appender.setFile(fileName + "_" + dateFormat.format(date) + ".log");

        PatternLayout layOut = new PatternLayout();
        layOut.setConversionPattern("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n");
        appender.setLayout(layOut);

        log.addAppender(appender);
    }

    public static Logger getLogger(){
        if(initializationFlag == false){
            intializeLogger();
            initializationFlag = true;
            return LogClass.log;
        }
        else{
            return LogClass.log;
        }
    }

    public static void setFileName(String fileName){
        LogClass.fileName = fileName;
    }
}

Maintenant, chaque fois que vous souhaitez utiliser le programme de journalisation dans votre programme, écrivez ces deux lignes:

LogClass.setFileName(yourFileName);
LogClass.getLogger().debug("hello!!");

Bonne codage.

7
doer_uvc

Il est plus logique d'étendre FileAppender avec votre propre classe, dans laquelle vous substituez la méthode setOptions(). Ensuite, dans votre log4j.properties, vous configurez la racine pour se connecter à yourpackage.yourFileAppender, ce qui est beaucoup plus propre.

4
Nik

Dans votre classe contenant la méthode main, définissez le nom de votre classe sur une propriété système. Dans l'exemple suivant, j'ai utilisé log_dir comme nom de propriété.

class ABC{
 public static void main(String s[]){
  System.setProperty("log_dir", ABC.class.getSimpleName());
 }
}

Et dans votre fichier log4j.xml, utilisez la propriété log_dir dans l'attribut value du fichier param

<appender name="FA" class="org.Apache.log4j.DailyRollingFileAppender">
  <param name="DatePattern" value="'_'yyyyMMdd"/>
  <param name="File" value="D:/logFiles/${log_dir}"/>
  <layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/>
</appender>

Fonctionne comme un charme

0
Bopsi