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
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.
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) {
}
}
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>
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.