web-dev-qa-db-fra.com

Lire les variables d'environnement à partir du fichier de configuration de la déconnexion

J'ai ce fichier logback.xml:

<configuration debug="true" scan="true" scanPeriod="60 seconds">

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
    </layout>
  </appender>

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <File>${MY_HOME}/logs/mylog.log</File>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <FileNamePattern>logs/my.%d{yyyy-MM-dd}.log</FileNamePattern>
      <MaxHistory>30</MaxHistory>
    </rollingPolicy>

    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level - %msg%n</Pattern>
    </layout>

  </appender> 

  <root level="TRACE">
    <appender-ref ref="FILE"/>
  </root>

</configuration>

Et ${MY_HOME} est une variable système définie (echo $MY_HOME sur linux montre le chemin correct).

Le fait est que la déconnexion ne semble pas la lire correctement, elle stocke les journaux sous MY_HOME_IS_UNDEFINED/logs/my.log

Qu'est-ce que je fais mal? Merci beaucoup!

EDIT: J'ai fait une erreur et j'ai mis OSC_HOME là où je voulais vraiment dire MY_HOME. Désolé pour ça

56
Pablo Fernandez

Contrairement à ce que les autres ont dit, la la documentation de déconnexion indique explicitement que "Lors de la substitution, les propriétés sont recherchées d'abord dans la portée locale, dans la portée de contexte en second, dans la portée de propriétés du système en troisième, et dans l'environnement OS quatrième et dernier ". Donc, si la propriété est définie dans l'environnement, la déconnexion la trouvera.

J'avais le même problème lors de l'exécution de mon projet dans Eclipse. Si c'est le problème que vous rencontrez, vous pouvez le résoudre en accédant à Exécuter les configurations -> Environnement et en ajoutant MY_HOME aux variables d'environnement.

Je ne sais pas vraiment pourquoi il ne charge pas l'environnement natif par défaut. Il y a même une option appelée "Ajouter l'environnement à l'environnement natif" qui ne semble pas avoir d'effet pour moi.

55
Tim Pote

Il existe une autre façon de lire les variables d'environnement à partir du fichier de configuration. vous pouvez placer vos variables personnalisées dans un contexte de déconnexion avec un écouteur de contexte.

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="30 seconds">

    <!-- THIS IS OUR CUSTOM CONTEXT LISTENER -->
    <contextListener class="com.myapp.logging.listener.LoggerStartupListener"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%-5level] %d{HH:mm:ss.SSS} [%.6thread] %logger - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="FILEOUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${MY_HOME}/${LOG_FILE}.log</file>
        <append>true</append>
        <!-- Support multiple-JVM writing to the same log file -->
        <prudent>true</prudent>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- Daily rollover -->
            <fileNamePattern>${MY_HOME}/${LOG_FILE}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- Keep 7 days' worth of history -->
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%-5level] %d{HH:mm:ss.SSS} [%.6thread] %logger - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILEOUT"/>
    </root>
</configuration>

LoggerStartupListener.Java

package com.myapp.logging.listener;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.LoggerContextListener;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.spi.ContextAwareBase;
import ch.qos.logback.core.spi.LifeCycle;

public class LoggerStartupListener extends ContextAwareBase implements LoggerContextListener, LifeCycle {

    private static final String DEFAULT_LOG_FILE = "MYAPP";

    private boolean started = false;

    @Override
    public void start() {
        if (started) return;

        String userHome = System.getProperty("user.home"); 

        String logFile = System.getProperty("log.file"); // log.file is our custom jvm parameter to change log file name dynamicly if needed

        logFile = (logFile != null && logFile.length() > 0) ? logFile : DEFAULT_LOG_FILE;

        Context context = getContext();

        context.putProperty("MY_HOME", userHome);
        context.putProperty("LOG_FILE", logFile);

        started = true;
    }

    @Override
    public void stop() {
    }

    @Override
    public boolean isStarted() {
        return started;
    }

    @Override
    public boolean isResetResistant() {
        return true;
    }

    @Override
    public void onStart(LoggerContext context) {
    }

    @Override
    public void onReset(LoggerContext context) {
    }

    @Override
    public void onStop(LoggerContext context) {
    }

    @Override
    public void onLevelChange(Logger logger, Level level) {
    }
}
26
bhdrk

Vous voulez peut-être dire MY_HOME. Dans votre fichier de configuration, il y a une référence pour OSC_HOME. Voir Substitution de variables règles de Logback pour plus de détails.

Vous pouvez transmettre la variable d'environnement en tant que propriété Java System, puis Logback effectuera la substitution de variable. Vous pouvez transmettre cette option en tant que JVM dans votre ligne de commande. Par exemple:

Java -DMY_HOME=${MY_HOME} -cp ... MainClass

Ou Vous pouvez définir MY_HOME dans votre fichier de configuration lui-même.

<configuration debug="true" scan="true" scanPeriod="60 seconds">
  <property name="MY_HOME" value="/home/my" />
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <File>${MY_HOME}/logs/mylog.log</File>
  </appender> 
</configuration>
12
Chandra Patni

Si vous utilisez Eclipse, vous devez le redémarrer pour récupérer les variables d'environnement, mais vous ne pouvez pas utiliser: Fichier -> Redémarrer

Au lieu de cela, vous devez le fermer complètement puis le redémarrer à nouveau.

1
Brad Cupit