2010-09-27 13 views
18

Sto provando a impostare il percorso di appback Logback a livello di programmazione. (RollingFileAppender con FixedWindowRollingPolicy per l'esattezza)Impostazione del percorso di Applet di Logback programmaticamente

sto facendo questo perché voglio consentire i miei utenti per impostare il percorso di registrazione in una finestra di preferenza (Eclipse RCP)

Ho provato qualcosa di simile, ma io non cambia il percorso del registro da ciò che è definito nel file di configurazione:

Logger logback_logger = (ch.qos.logback.classic.Logger)LoggerFactory 
    .getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); 
RollingFileAppender<ILoggingEvent> rfappender = 
    (RollingFileAppender<ILoggingEvent>)logback_logger.getAppender("FILE"); 
rfappender.setFile(newFile); 
FixedWindowRollingPolicy rollingPolicy = 
    (FixedWindowRollingPolicy)rfappender.getRollingPolicy(); 
rollingPolicy.setFileNamePattern(newPattern); 

risposta

13

Uso delle proprietà di sistema e ricaricare il file di configurazione sembra più pulito:

cambiamento il file logback.xml:

<file>${log_path:-}myfile.log</file> 
.... 
<FileNamePattern>${log_path:-}myfile.%i.log</FileNamePattern> 

questo imposterà il percorso predefinito per la directory di lavoro. Poi, utilizzare:

System.setProperty("log_path", my_log_path); 

//Reload: 
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
ContextInitializer ci = new ContextInitializer(lc); 
lc.reset(); 
try { 
    //I prefer autoConfig() over JoranConfigurator.doConfigure() so I wouldn't need to find the file myself. 
    ci.autoConfig(); 
} catch (JoranException e) { 
    // StatusPrinter will try to log this 
    e.printStackTrace(); 
} 
StatusPrinter.printInCaseOfErrorsOrWarnings(lc); 
+2

L'utilizzo di ContextInitializer non è corretto. Vedi la mia risposta per l'approccio corretto. – Ceki

+1

cose interessanti! Una cosa che ho cambiato: io uso lc.putProperty ("log_path", my_log_path) invece di System.setProperty. Sembra migliore dal momento che sono stati utilizzati 0 globals. – Sasha

5

Guardando il codice Logback, ho trovato una soluzione:

rollingPolicy.stop(); 
rfappender.stop(); 
rollingPolicy.start(); 
rfappender.start(); 

In questo modo Logback utilizza le nuove definizioni. Tuttavia, sembra ancora una soluzione.

26

Una volta configurato il livello di codice appender, è necessario richiamare il suo metodo start(). Se l'appender ha sottocomponenti, prima invoca start() sui sotto-componenti. Quindi aggiungi l'appender al registratore di tua scelta.

Ecco un esempio:

import ch.qos.logback.classic.Logger; 
import ch.qos.logback.classic.encoder.PatternLayoutEncoder; 
import ch.qos.logback.core.rolling.FixedWindowRollingPolicy; 
import ch.qos.logback.core.rolling.RollingFileAppender; 
import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy; 
import ch.qos.logback.core.util.StatusPrinter; 
import org.slf4j.LoggerFactory; 
import ch.qos.logback.classic.LoggerContext; 

public class Main { 
    public static void main(String[] args) { 
    LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 

    RollingFileAppender rfAppender = new RollingFileAppender(); 
    rfAppender.setContext(loggerContext); 
    rfAppender.setFile("testFile.log"); 
    FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy(); 
    rollingPolicy.setContext(loggerContext); 
    // rolling policies need to know their parent 
    // it's one of the rare cases, where a sub-component knows about its parent 
    rollingPolicy.setParent(rfAppender); 
    rollingPolicy.setFileNamePattern("testFile.%i.log.zip"); 
    rollingPolicy.start(); 

    SizeBasedTriggeringPolicy triggeringPolicy = new ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy(); 
    triggeringPolicy.setMaxFileSize("5MB"); 
    triggeringPolicy.start(); 

    PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
    encoder.setContext(loggerContext); 
    encoder.setPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n"); 
    encoder.start(); 

    rfAppender.setEncoder(encoder); 
    rfAppender.setRollingPolicy(rollingPolicy); 
    rfAppender.setTriggeringPolicy(triggeringPolicy); 

    rfAppender.start(); 

    // attach the rolling file appender to the logger of your choice 
    Logger logbackLogger = loggerContext.getLogger("Main"); 
    logbackLogger.addAppender(rfAppender); 

    // OPTIONAL: print logback internal status messages 
    StatusPrinter.print(loggerContext); 

    // log something 
    logbackLogger.debug("hello"); 
    } 
} 

Il codice di cui sopra è l'espressione programmatica delle misure adottate dal configuratore XML del logback, vale a dire Joran, quando si analizza il file RollingFixedWindow.xml.

+4

(È un po 'strano non essere d'accordo con te sulla registrazione, ma) questo non è quello che sto cercando di fare - Voglio configurare il mio logger con XML, e cambiare solo la posizione in base al codice. In questo modo, gli utenti avanzati possono controllare le proprietà di registrazione a grana fine e gli utenti inesperti utilizzano l'interfaccia utente. Riavviare l'appender tramite il codice funziona; utilizzando le proprietà di sistema e ContextInitializer funziona meglio e meno hard-coded, perché è errato? – yshalbar

+0

Questo approccio è ancora valido con le versioni recenti di Logback? –

+0

Il collegamento a 'RollingFixedWindow.xml' è rotto –

Problemi correlati