2013-01-11 11 views
5

Ho una console di amministrazione che sto costruendo e voglio visualizzare i registri creati in Logback per la mia applicazione. Tuttavia, dove tali registri sono memorizzati è diverso per ambiente. Ho diversi file di proprietà che definiscono in cui sono memorizzati i log:Proprietà di accesso definite in Logback a livello di programmazione

<configuration> 
    <property resource='log.properties'/> 
    <property resource='log.${ENV:-prod}.properties'/> 

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${log.dir}/sync.log</file> 
    ... 
</configuration> 

mi piacerebbe trovare il valore di ${log.dir} da Logback's API Java. Avrei provato quanto segue, ma non ha nessuna delle proprietà definite nelle risorse. Ad esempio:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
String logDir = loggerContext.getProperty("log.dir"); // this always returns null 

Quindi la mia domanda è che API dovrei usare?

risposta

7

Per impostazione predefinita, le proprietà sono definite in "locale" scope. Tuttavia, è possibile forzare una proprietà da avere la possibilità contesto, nel qual caso è abbastanza facile per ottenere il valore della proprietà:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
String val = lc.getProperty(aString); 

Definizione delle proprietà nel "contesto" campo di applicazione è considerato un po 'la mano pesante. Invece di definire tutte le proprietà/molti in ambito contesto, è possibile definire solo una singola proprietà nell'ambito del contesto. Ecco un esempio:

<configuration> 
    <!-- get many props from a file --> 
    <property resource='log.properties'/> 
    <-- set only one to be in context scope --> 
    <property scope="context" name="log.dir.ctx" value="${log.dir}" /> 
    ... 
</configuration> 

È quindi possibile ottenere il valore che si sta cercando con:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
String val = lc.getProperty("log.dir.ctx");