2012-03-29 12 views
5

Sto provando a modificare alcune funzionalità di logback (Appendici personalizzati e simili). Per testarlo, vorrei configurare Logback e chiamare i suoi metodi di registrazione direttamente senza passare attraverso sl4j.Come utilizzare Logback direttamente senza passare attraverso SLF4J

Il motivo di questo strano requisito è di poter testare la funzionalità di logback in un ambiente in cui sono disponibili anche altri bridge SLF4J.

Quindi voglio fare le cose qui descritto: http://logback.qos.ch/manual/configuration.html#joranDirectly senza un riferimento a SLF4J

risposta

3

non l'ho provato, ma sembra corretto, forse vi aiuterà:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
ch.qos.logback.classic.Logger log = lc.getLogger(foo.Bar.class); 

Il ch.qos.logback.classic.Logger implementa org.slf4j.Logger ma puoi usarlo direttamente. Potrebbe essere necessario ottenere LoggerContext in modo diverso.

+1

LoggerFactory fa parte di slf4j e utilizza la classe StaticLoggerBinder che viene fornita con le varie implementazioni di bridge, quindi con questo utilizzo ancora il meccanismo di associazione di slf4j. –

+0

@JensSchauder: cosa significa semplicemente creare 'new LoggerContext()' ed evitare completamente l'API SLF4J? –

+1

Sto sviluppando un'API, dove non posso usare SLF4j, è possibile utilizzare il logback standalone? – Akhilesh

1

Purtroppo, non penso sia possibile. Se dai uno sguardo allo Logback Logger source (o ad altre classi) lo vedrai dipende da slf4j.

Questo non è bello, imho, in quanto il logback dovrebbe non essere a conoscenza di slf4j.

2

C'è un modo per scoprirlo.

Ecco l'esempio di come è possibile configurare logback

// Here we create context 
LoggerContext loggerContext = new LoggerContext(); 
// Initializer is used to enrich context with details 
ContextInitializer contextInitializer = new ContextInitializer(loggerContext); 
try { 
    // Get a configuration file from classpath 
    URL configurationUrl = Thread.currentThread().getContextClassLoader().getResource("custom-logback-configuration.xml"); 
    if (configurationUrl == null) { 
     throw new IllegalStateException("Unable to find custom logback configuration file"); 
    } 
    // Ask context initializer to load configuration into context 
    contextInitializer.configureByResource(configurationUrl); 
    // Here we get logger from context 
    logger = loggerContext.getLogger(LogReporter.class); 
} catch (JoranException e) { 
    throw new RuntimeException("Unable to configure logger", e); 
} 

In generale, se volete sapere come qualsiasi opera SLF4J backend, si può solo guardare alla fonte classe org.slf4j.impl.StaticLoggerBinder da quello di back-end .

+0

Questo ha funzionato perfettamente per me in un contesto simile in cui avevo bisogno di impostare un 'ambiente' di logback (contesto) esplicitamente senza fare affidamento sull'associazione SLF4J (poiché SLF4J era già associato a log4j e non avevo accesso al classpath per essere in grado di cambiarlo utilizzando i vari bridge SLF4J o simili). –

Problemi correlati