2012-01-18 10 views
11

He hecho todo lo posible para configurar el eclipse y mi aplicación Java para usar un archivo log4j.properties. Sin embargo, no parece estar usando el archivo de propiedades y no estoy seguro de por qué.Aplicación Java: Hacer que Log4j funcione dentro del entorno Eclipse

Bibliotecas: slf4j-api-1.6.1, SLF4J-jdk14-1.6.1

Dentro de la aplicación del registro funciona bien. Puedo imprimir información, advertencias y errores en la consola de eclipse.

Lo que me gustaría hacer es cambiar el nivel de registro para depurar e imprimir todos los mensajes de registro tanto en la consola como en un archivo de registro.

He creado un archivo log4j.properties que tiene este aspecto:

log4j.rootLogger=DEBUG,console,file 
log4j.rootCategory=DEBUG, R, O 

# Stdout 
log4j.appender.O=org.apache.log4j.ConsoleAppender 

# File 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=log4j.log 

# Control the maximum log file size 
log4j.appender.R.MaxFileSize=100KB 

# Archive log files (one backup file here) 
log4j.appender.R.MaxBackupIndex=5 
log4j.appender.file.File=checkLog.log 
log4j.appender.file.threshold=DEBUG 

log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.O.layout=org.apache.log4j.PatternLayout 

log4j.appender.R.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n 
log4j.appender.O.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n 

Mi Estructura del directorio es el siguiente:

My Project 
--src/ 
----MYProject/ 
------*.java 
--bin/ 
----MYProject/ 
------*.class 
--log4j/ 
----log4j.properties 

en Eclipse fui a: Ejecutar Configuraciones -> ruta de clases (pestaña) -> Clic derecho en "Entradas de usuario" -> Se agregó "log4j" como una nueva carpeta "y guardado.

Luego en mi código llamo al registrador como este (sa MPLE código para demostrar mi acercamiento por lo que puede tener errores de sintaxis):

package MYProject; 
import org.slf4j.LoggerFactory; 

public class MyClass{ 

    final org.slf4j.Logger test_logger = LoggerFactory.getLogger(MyClass.class); 

    public MyClass(){} 

    public someMethod(){ 
    test_logger.debug("Some Debug"); 
    test_logger.info("Some Info"); 
    test_logger.warn("Some Warning"); 
    test_logger.error("An Error"); 
    } 

} 

entonces yo llamo algunMetodo e imprime INFO, WARN, ERROR a la consola de Eclipse. No imprimirá DEPURACIÓN y no se imprimirá en un archivo.

Agradecería cualquier sugerencia sobre lo que puedo estar haciendo mal.

Respuesta

14

Puede haber otro archivo o log4j.propertieslog4j.xml en la ruta de clase delante de su log4j.properties. Abra la configuración de ejecución para su proyecto y agregue -Dlog4j.debug=true como argumento VM para su proyecto. Esto le indicará a log4j que imprima mucha información adicional en la consola, incluido el archivo de configuración que está usando.

+1

He jugado con tus comentarios y apines y esto es lo que he descubierto. No puedo agregar PropertyConfigurator con mi configuración actual, ya que es una propiedad de la biblioteca log4j y no una parte de la biblioteca slf4j-jdk14 (la carpeta log4j de slf4j, según tengo entendido). Establecer los parámetros de VM en verdadero no devuelve ninguna depuración adicional. – Bryce

+0

Si luego hago referencia a la biblioteca log4j real además de slf4j-jdk14 empiezo a obtener resultados de depuración. Solo al agregar la referencia, mi archivo log4j.properties comienza a funcionar. Esto parecería obtener el 90% de lo que necesito. Esto aumenta la depuración pero los comandos que imprimo en la clase dada en la publicación inicial ya no se imprimen (test_logger.debug, test_logger.info, etc.). Creo que esto se debe a que la biblioteca log4j que agregué sobrescribió org.slf4j.Logger que estaba usando anteriormente. Estoy un poco confundido sobre cómo lograr que estas dos bibliotecas funcionen mejor juntas, ¿alguna sugerencia? – Bryce

+1

slf4j es solo una fachada para el registro, aún debe agregar la biblioteca de registro real (log4j en su caso) a su classpath. Vea este enlace: http://slf4j.org/manual.html#binding –

2

Necesita decirle a su código que use el archivo de propiedades. Antes de cualquier registro se hace por favor ponga

PropertyConfigurator.configure("log4j/log4j.properties"); 
3

Si está utilizando la fachada tala slf4j, entonces es necesario que especifique exactamente uno backend tala mediante la inclusión del archivo JAR correspondiente para ese servidor. En su caso, ha instalado slf4j-jdk14-x.x.x.jar en su classpath, que es solo un backend de registrador genérico.

Para utilizar el log4j back-end, hay que desmontar la slf4j-jdk14-x.x.x.jar y reemplazarlo con slf4j-log4j12-x.x.x.jar. Si no lo elimina, slf4j debe elegir solo un contenedor de back-end, y probablemente no el que desea.

Por supuesto, también necesitará el archivo log4j-x.x.x.jar en su classpath también.

Una vez que estos archivos jar estén en su lugar, el parámetro VM de -Dlog4j.debug funcionará y será útil en la depuración de donde provienen las configuraciones de registro.

0

Es posible que tenga una versión anterior en su directorio de destino. Limpie el proyecto y vuelva a intentarlo.

Aparte de eso, debe asegurarse de que actualice el proyecto de eclipse si no agregó el log4j.properties a través de eclipse.

0

elimine jre (JRE System Library) del proyecto en las propiedades del proyecto de ruta/tab de la biblioteca y vuelva a establecer jre!

+0

¿Podría elaborar más su respuesta agregando un poco más de descripción acerca de la solución que proporciona? – abarisone

Cuestiones relacionadas