Question

Est-il possible de référencer des variables d'environnement système (par opposition aux propriétés système Java) dans un fichier de configuration log4j xml?

J'aimerais pouvoir faire quelque chose comme:

<level value="${env.LOG_LEVEL}" />

et obtenez-le à partir des variables d'environnement système, afin que je puisse éviter de transmettre tant de choses avec les paramètres -D.

Était-ce utile?

La solution

Cette syntaxe n'est documentée que dans log4j 2.X, assurez-vous donc que vous utilisez la version correcte. Cela 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>

Autres conseils

J'ai essayé de le faire récemment et je n'ai pas réussi à le faire fonctionner. Ce que j'ai fini par faire est d'envoyer une variable au démarrage. Donc, disons que vous avez 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 cela n'est pas pris en charge, mais vous pouvez fondamentalement faire deux choses pour intégrer vos variables d'environnement:

  1. Utilisez System.setProperty avant la configuration de Log4J

  2. Convertissez vos variables d'environnement en propriétés système dans votre programme de lancement

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 de savoir où mettre ce code. En particulier, si vous utilisez un conteneur Tomcat ou similaire, cela peut être gênant.

L'autre dépend en grande partie de votre environnement. En gros, si vous avez un script shell qui lance votre application, vous pouvez écrire une magie du 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 les prendre en charge, par exemple. catalina.sh ou similaire.

Vous devez insérer un signe deux-points entre env et le nom de la variable, comme suit:

<level value="${env:LOG_LEVEL}" />

Créez une variable système. Je préfère utiliser setenv.bat pour de telles 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top