2012-03-29 9 views
5

Estoy tratando de ajustar algunas funciones de logback (Appenders personalizados y similares). Para probarlo, me gustaría configurar Logback y llamar a sus métodos de registro directamente sin pasar por sl4j.Cómo usar Logback directamente sin pasar por SLF4J

El motivo de este extraño requisito es poder probar la funcionalidad de inicio de sesión en un entorno donde también están disponibles otros puentes SLF4J.

Así que quieren hacer las cosas se describe aquí: http://logback.qos.ch/manual/configuration.html#joranDirectly sin una referencia a SLF4J

Respuesta

3

no lo he probado, pero parece correcta, tal vez ayudará a:

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

El ch.qos.logback.classic.Logger implementa org.slf4j.Logger pero puedes usarlo directamente. Es posible que deba obtener LoggerContext de manera diferente.

+1

LoggerFactory es parte de slf4j y utiliza la clase StaticLoggerBinder que viene con las diversas implementaciones de puentes, así que sigo usando el mecanismo de enlace de slf4j con esto. –

+0

@JensSchauder: ¿qué hay de simplemente crear 'nuevo LoggerContext()' y evitar completamente la API SLF4J? –

+1

Estoy desarrollando una API, donde no puedo usar SLF4j, ¿es posible usar logback autónomo? – Akhilesh

1

Lamentablemente, no creo que sea posible. Si echas un vistazo a Logback Logger source (u otras clases), verás que depende de slf4j.

Esto no es agradable, en mi humilde opinión, ya que logback no debe tener en cuenta slf4j.

2

Hay una manera de averiguarlo.

Aquí está el ejemplo de cómo se puede configurar 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); 
} 

En general, si usted quiere saber cómo cualquier obra SLF4J back-end, es posible que sólo mirar fuente de la clase org.slf4j.impl.StaticLoggerBinder de ese backend .

+0

Esto funcionó perfectamente para mí en un contexto similar en el que necesitaba configurar un 'entorno' de Logback (contexto) explícitamente sin depender del enlace SLF4J (ya que SLF4J ya estaba enlazado a log4j y no tenía acceso al classpath para poder cambiarlo utilizando varios puentes SLF4J o similares). –

Cuestiones relacionadas