2008-10-21 14 views
21

Estoy comenzando a desarrollar un plugin de Eclipse (técnicamente, un plugin de 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 commons como Normalmente lo haría.Ingresando plugins de Eclipse/OSGi

He incluido el paquete de registro de commons en las dependencias del complemento, y de hecho, cuando registro algo (en 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 el classpath (para el tiempo de ejecución, al igual que el paquete common-logging) 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é tengo que hacer para que realmente puedo controlar la salida del registrador?

Éstos son algunos de los mensajes de salida de la muestra, con la esperanza de que el formato puede coincidir con un valor predeterminado para java.util.logging, o proporcionar otros consejos 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 intentado varias combinaciones de:

y puedo única consigo DEBUG o inferiores, los mensajes de nivel a aparecer si estoy corriendo OSGi manualmente desde un indicador (que es poco 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 ser anulado por una configuración de eclipse.

También intenté poner varios archivos de configuración para las bibliotecas anteriores en numerosos lugares, incluso como fragmentos de plug-in adjuntos a sus respectivas bibliotecas, como se sugiere here, y aún así, ocurre el mismo resultado.

he implementado un LogListener costumbre, y recorrió toda la ruta de un mensaje de registro (así que sé cómo, de todos modos) con System.out.println de, y los mensajes de depuración son presente justo hasta que son salida por cualquier API de registro subyacente que estoy usando, entonces desaparecen.

Respuesta

23

3 días más tarde ...

me encontré con el problema! Había dos cosas que tenía que hacer, en primer lugar, hubo un problema con un archivo MANIFEST.MF:

que había lo siguiente en el MANIFIEST.MF para un solo 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 

Eso debe han 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 utilizado como un paquete, cuando debería haber sido utilizado como un paquete. (Tenía un archivo log4j en mi directorio lib desde que esperaba que Log4j "simplemente funcionara" con OSGi). El contenedor funciona como, ordenado. Evidentemente encontró cierta configuración de log4j a nivel de eclipse, e hizo uso de eso. Como solo era un contenedor (no un paquete), no utilizaba ningún fragmento que pudiera especificar una configuración de registro personalizada, lo que nos lleva a lo siguiente:

Necesitaba configurar un paquete de fragmento para especificar la configuración de registro. This link desde VonC me dio la información para hacer eso. Eso implicaba hacer una serie de cosas. Desafortunadamente, el paquete con el MANIFEST.MF incorrecto todavía tenía el archivo log4j especificado en Bundle-ClassPath, y eso parece anular la lista Importar-Paquete.

Finalmente descubrí lo que estaba sucediendo cuando necesité iniciar sesión en otro paquete (me había dado por vencido en este momento y volví a usar registros en el nivel de Avisar y superior). Este nuevo paquete no podría encontrar una configuración de registro! (entonces tuve tres paquetes ejecutándose en el mismo entorno OSGi, cada uno con un comportamiento diferente de log4j, uno con mi configuración de fragmento, otro con algunos ajustes de registro aleatorios de Eclipse 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.

Me debes un enormes gracias a los autores de la mayor parte de Eclipse Zone, VonC, Ekkes, y todos en #eclipse en freenode por su ayuda y paciencia :)

+0

@rcreswick puede usted por favor hágamelo saber dónde tiene colocaste el archivo log4j.properties en el complemento – VamsiKrishna

18

Esta no es una respuesta real a su pregunta, pero puede encontrar algunas pistas en este set of articles by ekke.

supongo que ya ha leído "Using Log4J in Eclipse Equinox/OSGi":

Quizás quiso iniciar una sesión OSGi en un modo de consola?

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

De esta manera, puede probar log4j en un entorno de osgi puro y comprobar si funciona allí.

Let utilización sabe si encuentra una solución (publicada como una respuesta), y voy a votar para arriba;)