Bonjour,
J'ai fais quelques recherches infructueuses sur ce forum quand à savoir de quelle manière on peut modifier un Appender Log4j (ainsi qu'en récupérer un) à l'intérieur d'un code Java ?
Mon but est de modifier le fichier de sortie d'un appender de manière à utiliser le même Logger dans mon code, mais qui écrit sur différents fichiers en sortie selon le comportement de mon code.
En gros je ne peux pas configurer différents Loggers à l'avance dans un fichier de configuration, d'où cette demande.
Pour ce que j'en ai déjà fait, voici comment j'ai procédé:
1 - mise en place d'un fichier de properties que je load au début de mon programme pour que différents Logger Log4j soient opérationnels.
2 - Récupération d'un Appender défini dans mon fichier de properties et tentative de le modifier
Cette deuxième phase coince.
Voici le code Java sur lequel je suis parti pour tenter la chose, où 'FtmLogger.TMP_LOG_NAME' est le nom de mon Logger et 'FtmLogger.TMP_APPENDER' le nom de l'appender (voir valeur dans fichier de configuration ci-dessous), tout deux définis dans le fichier log4j de configuration:
Le code en gras est mon code d'origine. Le reste c'est des traces que j'ai afficher pour comprendre qu'est ce qui ne fonctionnait pas. Il en ressort que je ne récupère aucun appender depuis mon objet Logger récupéré.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public Logger getLogger (){ // --- Modify the appender of logger FTMTMP Appender myAppender = Logger.getLogger(FtmLogger.TMP_LOG_NAME).getAppender(FtmLogger.TMP_APPENDER); Enumeration myEnum = Logger.getLogger(FtmLogger.TMP_LOG_NAME).getAllAppenders(); System.out.println("ENUM SIZE = "+myEnum.hasMoreElements()); while ( myEnum.hasMoreElements() ){ Object myApp = myEnum.nextElement(); System.out.println("Class app = "+myApp.getClass().getName()); } FileAppender myFApp = (FileAppender) myAppender; if ( myAppender == null ){ System.out.println("myAppender NULL"); } myFApp.setFile(getRoot().concat("log/").concat(FtmUtil.LOG_LABEL).concat(".".concat(getCountry())).concat(".txt")); myFApp.activateOptions(); return Logger.getLogger(FtmLogger.TMP_LOG_NAME); }
ps: mon fichier de properties Log4j (pour la partie concernant le logger en question):
Je suis ouvert à toute remarque, que ce soit des modifications de ma piste actuelle ou de nouvelles pistes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #### Use two appenders, one to log to console, another to log to a file log4j.rootCategory=OFF ... log4j.logger.bidule.ftm.temporary=WARN, FTMTMP #### First appender writes to console STDOUT log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d - %F@%m%n #### Third appender writes into file log4j.appender.FTMTMP=org.apache.log4j.RollingFileAppender log4j.appender.FTMTMP.File=log/FTMTMP_NOCC.txt log4j.appender.FTMTMP.Append=false log4j.appender.FTMTMP.MaxFileSize=25MB log4j.appender.FTMTMP.MaxBackupIndex=10 log4j.appender.FTMTMP.layout=org.apache.log4j.PatternLayout
En vous remerciant par avance pour votre aide.
Cordialement.
Partager