java - para - Inicio de sesión en plugins de Eclipse/OSGi
plugin web eclipse (2)
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 ha leído " Uso de Log4J en Eclipse Equinox / OSGi ":
¿Lanzaste una sesión de osgi en modo consola?
java -jar org.eclipse.osgi_3.3.0.v20070530.jar -console -noExit -clean
De esta forma, puedes probar log4j en un entorno osgi puro y verificar si funciona allí.
Deje saber si encuentra una solución (publíquela como respuesta) y la votaré;)
Estoy empezando 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 lo haría normalmente.
He incluido el paquete de registro de commons en las dependencias del complemento y, de hecho, cuando registro algo (en INFO o una 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 classpath (para el tiempo de ejecución, al igual que el paquete de registro de commons) 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?
Estos son algunos ejemplos de mensajes de salida, con la esperanza de que el formato pueda coincidir con un valor predeterminado para java.util.logging, o brinde 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
Actualizar:
Ahora he probado varias combinaciones de:
- org.osgi.service.log.LogService et al.
- slf4j
- Log4J
- Hechos comunes
- java.util.logging
y solo puedo obtener los mensajes DEBUG, o de nivel inferior, para que aparezcan si estoy ejecutando OSGi manualmente desde un mensaje (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 ser anulado por una configuración de eclipse.
También traté de 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 aquí , y aún así, ocurre el mismo resultado.
Implementé un LogListener personalizado y rastreé la ruta completa de un mensaje de registro (y también sé cómo) con System.out.println, y los mensajes de depuración están presentes hasta que se generan por cualquier API de registro subyacente Estoy usando, luego desaparecen.
3 días despues...
¡Encontré el problema! Había dos cosas que tenía que hacer, primero, había un problema con un archivo MANIFEST.MF:
Tenía 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
Eso 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 log4j se estaba utilizando como un paquete, cuando debería haberse 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, ordenadamente. 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 otro 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 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 me di cuenta de lo que estaba pasando 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 pudo 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.
Debo un gran agradecimiento a los autores de gran parte de Eclipse Zone , VonC , Ekkes y todos en #eclipse en freenode por su ayuda y paciencia :)