在OSGi环境中使用ServiceLoader for log4j-jcl brigde

时间:2017-07-07 05:23:11

标签: osgi log4j2 apache-commons-logging

我试图在osgi模式下使用log4j-jcl桥,发现应该使用java.util.ServiceLoader从桥接jar获取LogFactoryImpl。我是OSGi的新手,所以在参考了一些教程后尝试了它,但它似乎没有用。捆绑处于RESOLVED状态。

LoggingActivator.java

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import java.util.ServiceLoader;

public class LoggingActivator  implements BundleActivator{

private static Log log;
ServiceLoader<LogFactory> serviceLoader = ServiceLoader.load(LogFactory.class);
LogFactory service = serviceLoader.iterator().next();

public LoggingActivator(){
    if (service != null){
        log = service.getLog(LoggingActivator.class);
    }
}

@Override
public void start(BundleContext bundleContext) throws Exception {
    log.info("Activated Logging");
}

@Override
public void stop(BundleContext bundleContext) throws Exception {
    log.info("Deactivated Logging");
}


}

的pom.xml

    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jcl</artifactId>
        <version>2.8.2</version>
    </dependency>
    <Export-Package>
        org.apache.logging.log4j.*,
        org.apache.commons.logging.*
    </Export-Package>
    <Import-Package>
        !org.apache.logging.log4j.*,
        !org.apache.commons.logging.*,
        *;resolution:=optional
    </Import-Package>

2 个答案:

答案 0 :(得分:0)

ServiceLoader在OSGi中不能很好地工作。我建议试试Apache Karaf。您以后不需要它,但它已经正确配置了日志记录,因此与从头开始设置所有内容相比,它更容易入手。

在你的包中只需初始化一个像OSGi之外的公共记录记录器。

class MyClass {
private Log log = LogFactory.getLog(MyClass.class);
...
}

将maven-bundle-plugin保留为默认值。结果是一个bundle,它导入了commons logging API包,这正是你所需要的。

然后启动karaf并部署您的捆绑包。日志记录应该开箱即用。有关详细信息,请参阅karaf logging guide

Karaf使用pax-logging。如果你想自己设置它,你需要捆绑包pax-logging-api和pax-logging-service,felix config admin和felix fileinstall。后端是log4j。您可以使用ConfigAdmin和名为etc / org.ops4j.pax.logging.cfg的配置对其进行配置。配置是标准的log4j配置文件。

答案 1 :(得分:0)

如果您想使用ServiceLoader,那么您应该查看Service Loader Mediator规范(OSGi纲要的第133章)。在Apache Aries上有一个名为SPI Fly的实现。

这个想法是Service Loader中介在运行时扩展了bundle的类,确保它正确设置了Thread Context ClassLoader,以便您使用ServiceLoader来查找实现。 Service Loader Mediator还为它找到的每个已注册的实现注册OSGi服务,因此如果您愿意,可以通过使用OSGi服务注册表完全避免使用ServiceLoader