Pregunta

Estoy empezando a desarrollar un plugin Eclipse (técnicamente, un plugin OSGi) y uno de los primeros problemas con los que me he encontrado es que parece que no puedo controlar la salida de registro de los comunes como normalmente lo haría.

He incluido el paquete de registro de commons en las dependencias del complemento, y de hecho, cuando registro algo (a INFO o mayor gravedad) se registra en la consola. Sin embargo, parece que no puedo iniciar sesión en ningún nivel inferior (como DEBUG o TRACE).

He especificado un archivo log4j.properties, y está en la ruta de clase (para el tiempo de ejecución, como lo es el paquete de registro de propiedades), pero ninguna de las configuraciones en ese archivo de propiedades tiene ningún impacto en el comportamiento del registrador. .

Aquí está el archivo log4j.properties:

#  Log4j Logging levels, in order of decreasing importance are:
#   FATAL, ERROR, WARN, INFO, DEBUG, TRACE
#

# Root logger option
log4j.rootLogger=ERROR,stdout
#,LOGFILE

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %r (%l) %t%n - %m%n

¿Qué debo hacer para poder controlar la salida del registrador?

Aquí hay algunos ejemplos de mensajes de salida, con la esperanza de que el formato pueda coincidir con un valor predeterminado para java.util.logging, o proporcionar otras sugerencias a alguien:

Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start
SEVERE: fatal_message
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start
WARNING: warn_message
Oct 21, 2008 11:01:23 PM com.stottlerhenke.sentinel.client.Activator start
INFO: info_message

Actualización :

Ahora he probado varias combinaciones de:

y puedo solo obtener DEBUG, o mensajes de nivel inferior para que aparezcan si estoy ejecutando OSGi manualmente desde un indicador (lo cual no es práctico para lo que estoy desarrollando). Además, no puedo efectuar ningún otro tipo de configuración de registro a través de varios archivos de propiedades. Todo lo que intento en ese sentido parece estar anulado por una configuración de eclipse.

También he intentado colocar varios archivos de configuración para las bibliotecas anteriores en numerosos lugares, incluso como fragmentos de complementos adjuntos a sus bibliotecas respectivas como se sugiere here , y aún así, sucede el mismo resultado.

He implementado un LogListener personalizado y he rastreado la ruta completa de un mensaje de registro (y también sé cómo, de todos modos) con System.out.println's, y los mensajes de depuración están presentes a la derecha Hasta que salgan de la API de registro subyacente que esté usando, desaparecerán.

¿Fue útil?

Solución

3 días después ...

¡Encontré el problema! Había dos cosas que tenía que hacer, primero, había un problema con un archivo MANIFEST.MF:

Tuve lo siguiente en MANIFEST.MF para un paquete:

Bundle-ClassPath: lib/jena.jar,
 .,
 org.apache.log4j-1.2.12.jar,
 lib/google-collect-snapshot.jar
Import-Package: com.acme.client.translation,
 com.acme.translation.interfaces,
 com.acme.shared.osgi,
 com.acme.utilities

Que debería haber sido esto:

Bundle-ClassPath: lib/jena.jar,
 .,
 lib/google-collect-snapshot.jar
Import-Package: com.acme.client.translation,
 com.acme.client.translation.interfaces,
 com.acme.shared.osgi,
 com.acme.utilities,
 org.apache.log4j

La diferencia clave es que el log4j estaba siendo usado como un paquete, cuando debería haber sido usado como un paquete. (Tenía un archivo log4j en mi directorio lib desde cuando esperaba que Log4j "solo funcione" con OSGi.) El archivo funciona , de alguna manera. Evidentemente, encontró alguna configuración log4j a nivel de eclipse y la utilizó. Como era solo un contenedor (no un paquete), no utilizó ningún fragmento que pudiera especificar una configuración de registro personalizada, lo que nos lleva a la otra cosa que tenía que suceder:

Necesitaba configurar un fragmento de paquete para especificar la configuración de registro. Este enlace de VonC me dio la información para hacerlo. Eso implicaba hacer varias cosas, desafortunadamente, el paquete con el MANIFEST.MF incorrecto todavía tenía el archivo log4j especificado en el Bundle-ClassPath, y eso parece anular la lista de Importación del Paquete.

Finalmente me di cuenta de lo que estaba sucediendo cuando necesitaba iniciar sesión en otro paquete (me había dado por vencido en este momento y volví a usar los registros en el nivel Warn y superior). Este nuevo paquete no pudo encontrar una configuración de registro! (entonces tuve tres paquetes que se ejecutaban en el mismo entorno OSGi, cada uno con un comportamiento log4j diferente, uno con la configuración de mis fragmentos, otro con algunas configuraciones de registro de Eclipse aleatorias y, finalmente, el nuevo paquete que no tenía ninguna configuración de registro). Las comparaciones detalladas de estos tres paquetes revelaron la diferencia en los archivos Manifest.MF, y ahora todos usan el paquete de fragmentos.

Debo un enorme gracias a los autores de gran parte de Eclipse Zone , VonC , Ekkes , y todos en #eclipse en freenode por su ayuda y paciencia :)

Otros consejos

Esta no es una respuesta real a su pregunta, pero puede encontrar algunas pistas en este conjunto de artículos de ekke .

Supongo que ya has leído " Uso de Log4J en Eclipse Equinox / OSGi " ;:

¿Lanzó una sesión osgi en modo consola?

java -jar org.eclipse.osgi_3.3.0.v20070530.jar -console -noExit -clean

De esa manera, puedes probar log4j en un entorno de OSG puro y comprobar si funciona allí.

Avise si encuentra una solución (publíquela como una respuesta) y la votaré;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top