2012-06-21 12 views
15

He usado SLF4j como mi marco de trabajo de registro, respaldado por log4j. Mi problema es que estoy buscando una forma de cambiar el nivel de registro para mi registrador en tiempo de ejecución.¿Cómo cambiar el nivel de slf4j en el tiempo de ejecución?

Entiendo que slf4j no permite esto directamente a través de su propia API, y por lo tanto, tengo que acceder directamente al proveedor de registro. Personalmente, creo que esto es una gran deficiencia en slf4j. Entonces, ahora mi pregunta es ¿cómo puedo determinar programáticamente a través de slf4j qué proveedor estoy usando? El mayor propósito de usar slf4j es que te vuelves independiente del proveedor; puedes cambiar fácilmente de tu sistema de registro favorito sin tener que volver a codificar nada. Pero ahora, si tengo que hacer llamadas directas a log4j, estoy perdiendo esa habilidad.

Por lo menos, me gustaría poder determinar si estoy usando log4j como proveedor y, de ser así, permitir que el usuario cambie los niveles de registro.

Si hago LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME), el resultado es una instancia de org.slf4j.impl.Log4jLoggerAdapter y ni siquiera org.apache.log4j.Logger (como hubiera esperado/esperado).

¿Hay alguna manera de descubrir esto?

Gracias, Eric

+1

Ver: [¿Cómo encontrar a qué biblioteca se ha unido slf4j?] (Http://stackoverflow.com/questions/10505418) –

+0

Gracias. No estoy seguro de por qué me perdí eso en mi búsqueda original. –

Respuesta

13

SLF4J está diseñado como una abstracción para bibliotecas, no aplicaciones (por supuesto, usted puede y debe seguir utilizando SLF4J en llamadas de registro de su propia aplicación, por coherencia). En su propia aplicación, elige el marco logger subyacente, por lo que está bien acceder a la API log4j en las partes específicas de logging-config.

No hay forma de que una biblioteca se arruine con el cambio de la configuración de registro, en mi humilde opinión, por lo que no es apropiado que esté en la API de SLF4J.

+3

Bastante justo, si SLF4J se utiliza únicamente para bibliotecas. Sin embargo, me parece que algo tan flexible en una biblioteca también debería estar disponible para usar en su aplicación. El concepto de tener una única API a la que puedo conectar cualquier marco de trabajo es fantástico. Además, la mayoría de las veces, parte de la aplicación termina siendo refactorizada en una biblioteca en algún momento. Tener que recodificar cualquier referencia a log4j para convertirse en slf4j no tiene sentido. Si SL4j se diseñó solo para bibliotecas (que no leo en el sitio slf4j), me parece miope. –

+3

Disculpe, no dejó en claro: definitivamente debe usar SLF4J para las llamadas de inicio de sesión de su aplicación. Pero en la pequeña sección de tu código que trata sobre el cambio de la configuración de registro, simplemente envía el material a las clases de Log4J. Si decide cambiar las implementaciones de registro, tendrá que volver a escribir ese bit de todos modos. – artbristol

+0

De acuerdo. Solo estaba tratando de hacer todo genéricamente. Supongo que eso simplemente no es factible. Ni siquiera es una cuestión de conversión: tengo que hacer las llamadas usando directamente las clases de Log4j (es decir, usar log4j.Logger en lugar de slf4j.LoggerFactory para recuperar los registradores) –

Cuestiones relacionadas