2017-07-07 93 views
0

我想在osgi模式下使用log4j-jcl橋接,並發現應該使用java.util.ServiceLoader從橋接器jar中獲取LogFactoryImpl。我是OSGi的新手,因此在參考了一些教程之後嘗試了它,但似乎並不奏效。該包處於已解決狀態。在OSGi環境中使用ServiceLoader for log4j-jcl brigde

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> 

回答

0

的的ServiceLoader不能很好地在OSGi的工作。我建議試一試Apache Karaf。您稍後不需要它,但它的日誌記錄已經正確配置,因此與從頭開始設置所有內容相比,它更容易啓動。

在你的包中簡單地初始化一個像OSGi之外的公共日誌記錄器。

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

將maven-bundle-plugin保留爲默認值。結果是一個導入公共日誌記錄API包的包,它正是您所需要的。

然後啓動karaf並部署你的包。日誌記錄應該是開箱即用的。欲瞭解更多信息,請參閱karaf logging guide

卡拉夫使用pax記錄。如果你想自己設置,你需要捆綁pax-logging-api和pax-logging-service,felix config admin和felix fileinstall。後端是log4j。您可以使用ConfigAdmin和一個名爲etc/org.ops4j.pax.logging.cfg的配置來配置它。該配置是一個標準的log4j配置文件。

+0

爲了啓用日誌記錄功能而啓動並運行另一臺服務器是否是一個好主意?我懷疑這會影響主服務器的啓動時間。 –

+0

這不是我的意思。只需簡單地創建一個簡單的包來展示我建議的日誌記錄,然後將其部署到karaf中進行測試。然後在真實的設置中重新創建pax-logging設置。這一步之後,你不再需要卡拉夫了。 –

0

如果你想使用ServiceLoader,那麼你應該看看Service Loader Mediator規範(OSGi綱要的第133章)。在Apache Aries上有一個名爲SPI Fly的實現。

這個想法是Service Loader調解器在運行時擴展了你的bundle的類,確保它有正確設置的線程上下文ClassLoader爲你使用ServiceLoader來查找實現。 Service Loader Mediator還會爲其找到的每個註冊實現註冊OSGi服務,因此,如果您選擇使用OSGi服務註冊表,則可以完全避免使用ServiceLoader