2009-12-29 16 views
39

ho questo file logback.xml:variabili d'ambiente da Leggi logback file di configurazione

<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> 

E ${MY_HOME} è una variabile di sistema definito (echo $MY_HOME su Linux indica il percorso corretto).

La cosa è che logback doesnt sembra di leggere correttamente, memorizza i registri sotto MY_HOME_IS_UNDEFINED/logs/my.log

Che cosa sto facendo di sbagliato? Molte grazie!

EDIT: Ho fatto un errore e ho messo OSC_HOME dove intendevo veramente MY_HOME. Mi dispiace per il fatto che

risposta

8

Forse intendi MY_HOME. Nel tuo file di configurazione c'è riferimento per OSC_HOME. Vedi le regole Variable substitution di Logback per i dettagli.

È possibile passare la variabile di ambiente come proprietà di sistema Java e quindi Logback eseguirà la sostituzione di variabile. È possibile passare questo come opzione JVM nella riga di comando. Ad esempio:

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

Oppure È possibile definire MY_HOME nel proprio file di configurazione.

<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> 
+1

Dal link nella tua risposta: "Durante la sostituzione, le proprietà vengono ricercati in ambito locale prima, nel campo di applicazione contesto secondo, nelle proprietà del sistema ambito terzo, e *** nell'ambiente OS quarta e ultimo***." Quindi dovrebbe guardare le variabili d'ambiente di OS giusto? –

+1

@TimPote Sì, verrà esaminato le variabili di ambiente del SO –

-4

Le cose stanno effettivamente funzionando come previsto: logback non legge le variabili di ambiente a tutti quando si fa sostituzione di variabile. Citando il documentation:

Il valore della variabile sostituito può essere definita nel file di configurazione stessa, in un file delle proprietà esterne o come una proprietà di sistema.

Quindi, o utilizzare una delle soluzioni indicate o ottenere OSC_HOME_IS_UNDEFINED :)

+0

Il logback legge le variabili di ambiente del SO. Sotto [Scopes] (http://logback.qos.ch/manual/configuration.html#scopes) si parla di 'ambiente SO' che è un collegamento alla documentazione di Oracle sulle variabili di ambiente –

+1

La citazione sopra indica in effetti che le variabili di ambiente del SO sono non supportato. Tuttavia, non ho trovato la citazione sopra nella documentazione. I documenti attuali menzionano esplicitamente le variabili di ambiente del sistema operativo. – Ceki

44

Contrariamente a quello che gli altri hanno detto, la logback documentation explicitly states che "Durante la sostituzione, le proprietà vengono ricercati in ambito locale prima, in secondo l'ambito del contesto, nell'ambito delle proprietà del sistema terzo e nell'ambiente del sistema operativo quarto e ultimo ". Quindi se la proprietà è definita nell'ambiente, il logback la troverà.

Ho riscontrato lo stesso problema durante l'esecuzione del mio progetto in Eclipse. Se questo è il problema, è possibile risolverlo andando su Esegui configurazioni -> Ambiente e aggiungendo MY_HOME alle variabili di ambiente.

Non proprio sicuro del motivo per cui non sta caricando l'ambiente nativo per impostazione predefinita. C'è anche un'opzione chiamata "Aggiungi ambiente all'ambiente nativo" che non sembra avere alcun effetto per me.

+1

Le variabili di ambiente funzionano per me, ma ho dovuto riavviare Eclipse per ottenerle. Vedere la mia risposta a questa domanda –

+0

Questo è lo stesso per IntelliJ IDEA. Un riavvio completo dell'applicazione rileverà le variabili d'ambiente. – Jelle

1

Se stai usando Eclipse è necessario riavviarlo per raccogliere le variabili d'ambiente, ma si può non uso: File -> Riavvia

in realtà hai necessario chiudere completamente verso il basso e poi riavviarlo nuovamente su.

14

C'è un modo alternativo per leggere le variabili di ambiente dal file di configurazione. puoi mettere le tue variabili personalizzate in contesto di logback con listener di contesto.

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) { 
    } 
} 
+0

Registri necessari per includere l'id dell'istanza aws ec2. Questo era l'approccio che dovevo prendere. – n00b

-2

Invece di usare variabili ambientali, è possibile utilizzare tag per dichiarare le variabili in logback.xml.

Problemi correlati