2013-04-09 13 views
6

Ho tre progetti separati, ciascuno con i propri file logback.xml incorporati. Ognuno di questi file include un file di configurazione comune, la registrazione in casa durectory dell'utente:Come posso configurare logback condizionalmente in base al nome del contesto?

<include file="${user_home}/loggingConfig.xml"/> 

Dopo la comprendono, ho questa specifica:

<root level="error"> 
    <appender-ref ref="${appender:-console}" /> 
</root> 

Questo permette all'utente di configurare i loro livelli di log e appenders e li hanno applicati dal file di configurazione di registrazione principale.

Per esempio, in ~/loggingConfig.xml ho questa linea:

<property name="appender" value="file" /> 

Ma collaboratori che preferiscono congedo di registrazione console che la linea fuori.

Il problema è che vorrei utilizzare diversi appendici per ciascun file di registro. In altre parole, vorrei impostare un appender condizionatamente in base al progetto che sta leggendo il file di configurazione personalizzato.

Mi rendo conto che potrei configurare ciascun progetto in modo che legga file di configurazione con nomi diversi, ma vorrei eliminare la confusione e consentire anche la configurazione condivisa.

risposta

9

La documentazione è un po 'di riserva per la configurazione avanzata, ma ho scoperto che è possibile utilizzare il nome del contesto di logback come variabile con la registrazione condizionale. Quindi, per ogni progetto io definisco un nome contesto personalizzato nel file progetti logback.xml:

<contextName>project1</contextName> 

ecc ...

Poi, nel mio file ~/loggingConfig.xml posso fare questo:

<property name="appender" value="file" /> 

<!--if condition='property("CONTEXT_NAME").equalsIgnoreCase("project1")'> 
    <then> 
     <property name="appender" value="file" /> 
    </then> 
</if--> 
<if condition='property("CONTEXT_NAME").equalsIgnoreCase("project2")'> 
    <then> 
     <property name="appender" value="console" /> 
    </then> 
</if> 
<if condition='property("CONTEXT_NAME").equalsIgnoreCase("project3")'> 
    <then> 
     <property name="appender" value="file" /> 
    </then> 
</if> 

Questo può diventare un po 'goffo, ma in realtà sto usando questa soluzione per configurare le proprietà utilizzate da un singolo appender per diversi progetti, pur mantenendo un grazioso ritorno a un valore predefinito per i progetti che non hanno il loro blocco condizionale.

4

Nel caso in cui questo aiuta chiunque altro, questo è come ho creato la configurazione logback condizionale con una proprietà che può contenere più appenders:

<root level="${logback.loglevel}"> 
    <if condition='isDefined("logback.appenders")'> 
     <then> 
      <if condition='property("logback.appenders").contains("CONSOLE")'> 
       <then> 
        <appender-ref ref="CONSOLE"/> 
       </then> 
      </if> 
      <if condition='property("logback.appenders").contains("FILE")'> 
       <then> 
        <appender-ref ref="FILE"/> 
       </then> 
      </if> 
      <if condition='property("logback.appenders").contains("GELF")'> 
       <then> 
        <appender-ref ref="GELF"/> 
       </then> 
      </if> 
     </then> 
     <else> 
      <appender-ref ref="CONSOLE"/> 
     </else> 
    </if> 
</root> 
Problemi correlati