Usar log con Apache Karaf

De ChuWiki

Veamos como usar y configurar el log de Apache Karaf en nuestros bundles.

El Log de Apache Karaf[editar]

Apache Karaf usa OPS4J Pax Logging como sistema de log, ya que implementa standard OSGi Log Service API. Este sistema de log permite además, en teoría, que nuestros bundles usen cualquier sistema de log de los más conocidos, como

  • OSGi Log Service
  • Apache Log4j v1 and v2 framework
  • Apache Commons Logging framework
  • Logback framework
  • SLF4J framework
  • native Java Util Logging framework

y es OPS4J el que se encarga de capturar nuestro log y mostrarlo dentro de los log de apache karaf. En este ejemplo sólo he probado java util logging, el que viene con java por defecto.

Usar log en nuestro bundle[editar]

En las clases de nuestro bundle osgi, podemos usar java util logging de la forma habitual. Por ejemplo

import java.util.logging.Logger;

/**
 * Created by chuidiang on 7/12/17.
 */
@Component
public class AComponent {

    Logger logger = Logger.getLogger(AComponent.class.getName());

    @Activate
    public void start(){
        logger.info("Hello Logger !!");
    }
    ...
}

Listo, con esto nuestro log ya saldrá en el fichero de log de karaf $KARAF_HOME/data/log/karaf.log

Configurar nuestro log[editar]

Para configurar nuestro log, podemos usar el fichero de configuración de log propio de OPS4J en Karaf. Este fichero está en $KARAF_HOME/etc/org.ops4j.pax.logging.cfg . Este fichero es un fichero de log4j2 normal, por lo que la configuración es la de ese tipo de log. No importa el tipo de log que usemos, OPS4J se encargará de adaptarlo a la configuración que pongamos aquí.

Primero, definimos un logger para nuestras clases. Si todas mis clases están por debajo del paquete com.chuidiang y he creado el logger como se ve en el código java, usando AComponent.class.getName(), el logger en el fichero quedaría definido así

log4j2.logger.chuidiang.name = com.chuidiang
log4j2.logger.chuidiang.level = INFO

Es decir, log4j3.logger, el nombre nuestro logger "chuidiang" para referenciarlo más adelante en el fichero y el atributo "name" para darle un nombre "com.chuidiang", que es el nombre del paquete de nuestras clases (todas las que estén por debajo de com.chuidiang, no importa a qué profundidad). También ponemos el nivel de log que queremos

Luego definimos un appender para esto log. Imagina que queremos nuestro log en un fichero separado de karaf.log. El appender puede ser así

log4j2.appender.chuidiang.name = chuidiang
log4j2.appender.chuidiang.type = RollingRandomAccessFile
log4j2.appender.chuidiang.fileName = ${karaf.data}/log/chuidiang.log
log4j2.appender.chuidiang.filePattern = ${karaf.data}/log/chuidiang.log.%i
log4j2.appender.chuidiang.append = true
log4j2.appender.chuidiang.layout.type = PatternLayout
log4j2.appender.chuidiang.layout.pattern = ${log4j2.pattern}
log4j2.appender.chuidiang.policies.type = Policies
log4j2.appender.chuidiang.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.chuidiang.policies.size.size = 8MB

Un nombre para el appender, un tipo de appender (RollingRandomAccessFile). En la documentación de log4j2 puedes ver tipos de appender disponibles. Y lo necesario para configurar ese appender, como el nombre del fichero de log, tamaño, etc, etc

y finalmente con queda enlazar nuestro logger chuidiang con nuestro appender chuidiang. Este línea se encarga de eso

log4j2.logger.chuidiang.appenderRef.chuidiang.ref=chuidiang


Y eso es todo, arrancando nuestro bundle el karaf, veremos nuestro fichero $KARAF_HOME/data/log/chuidiang.log con el log de nuestro bundle.