Est-il possible de référencer des variables d'environnement système (par opposition à Java propriétés système) dans un fichier de configuration xml log4j?
J'aimerais pouvoir faire quelque chose comme:
<level value="${env.LOG_LEVEL}" />
et le faire extraire des variables d'environnement système, donc je peux éviter d'avoir à passer autant de choses avec les paramètres -D.
Cette syntaxe n'est documentée que dans log4j 2.X, alors assurez-vous d'utiliser la bonne version. Il ne fonctionne pas sur les versions 1.X.
<Appenders>
<File name="file" fileName="${env:LOG_PATH}">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
</PatternLayout>
</File>
</Appenders>
J'ai essayé de le faire récemment et je n'ai pas réussi à le faire fonctionner. J'ai fini par envoyer une variable au démarrage. Supposons donc que vous ayez une variable d'environnement appelée $ LOG_LEVEL:
<level value="${log_level}" />
et au démarrage ...
Java -Dlog_level=$LOG_LEVEL your_app
Je pense que ce n'est pas pris en charge, mais fondamentalement, vous pouvez faire deux choses pour apporter vos variables d'environnement:
Utilisez System.setProperty avant que Log4J ne soit configuré
Convertissez (vos) variables d'environnement en propriétés système dans votre lanceur
La première option se résume essentiellement à ceci:
for (Map<String,String>.Entry entry : System.getenv().entrySet()) {
System.setProperty(entry.getKey(), entry.getValue());
}
... mais la question est bien sûr où mettre ce code. En particulier, si vous utilisez une sorte de conteneur Tomcat ou similaire, cela peut être gênant.
L'autre dépend en grande partie de votre environnement. Fondamentalement, si vous disposez d'un script Shell qui démarre votre application, vous pouvez écrire de la magie Shell pour définir toutes les variables d'environnement en tant que propriétés, ou uniquement celles dont vous avez besoin, par exemple:
Java -DMY_ENV=$MY_ENV -DMY_OTHER_ENV=$MY_OTHER_ENV -cp ... com.example.Main
Il est également possible de modifier les scripts de démarrage de votre serveur pour prendre en charge cela, par exemple catalina.sh ou similaire.
Vous devez mettre deux points entre env et le nom de la variable, comme ceci:
<level value="${env:LOG_LEVEL}" />
Créez une variable système. Je préfère utiliser setenv.bat pour ces variables.
@echo off
rem app specific log dir
set "APP_LOG_ROOTDIR=../app/app-log"
exit /b 0
Ajouter une référence dans le fichier log4j.xml
<appender name="fileAppender" class="org.Apache.log4j.RollingFileAppender">
<param name="Threshold" value="DEBUG" />
<param name="MaxFileSize" value="512KB" />
<param name="MaxBackupIndex" value="10" />
<param name="File" value="${APP_LOG_ROOTDIR}/app.log"/>
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %c{1} %m %n" />
</layout>
</appender>