通过slf4j作为单独的osgi bundle进行logback

时间:2012-11-15 13:50:46

标签: maven logging osgi slf4j apache-karaf

我们在osgi中有karaf个应用程序,并希望在bundle jar中包含日志记录属性,以便将日志记录配置保存在源代码中(目前它们位于karaf/etc/org.ops4j.pax.logging.cfg

更新:事实上现在我们在Karaf CM Admin服务中保留日志配置,这是一个问题,因为在每个版本上我们都应该向我们的运营团队写一些特殊指令来进行任何微小的日志记录更改。此外,我们有多个karaf节点(~10),并且为每个节点重复这些操作是一项复杂且容易出错的任务。当然我们可以将Cellar安装到每个karaf节点,但它会使osgi env复杂化并需要一些支持,所以最简单的方法就是在源代码中保持配置

我用Google搜索easiest way to create a separate bundle,其中包含所有依赖项(logback,slf4j,config)的实际日志记录内容,并从中导出org.slf4

我尝试了这个pom.xml

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <configuration>
                <unpackBundle>true</unpackBundle>
                <instructions>
                    <Embed-Dependency>*;groupId=!junit|org.springframework|log4j|javax.jms|javax.mail</Embed-Dependency>
                    <Embed-Transitive>false</Embed-Transitive>
                    <Embed-Directory>target/dependency</Embed-Directory>
                    <Embed-StripGroup>true</Embed-StripGroup>
                    <Export-Package>org.slf4j</Export-Package>
                    <Import-Package>
                        *
                    </Import-Package>
                </instructions>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <excludeGroupIds>junit,org.springframework,log4j</excludeGroupIds>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>com.springsource.ch.qos.logback.classic</artifactId>
        <version>0.9.15</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>com.springsource.ch.qos.logback.core</artifactId>
        <version>0.9.15</version>
    </dependency>

但它会捆绑显示许多额外的依赖,如javax.mail/jms等:

Import-Package: javax.jms,javax.mail,javax.mail.internet,javax.management,javax.naming,javax.servlet,javax.servlet.http,javax.sql,javax.xml.parsers,org.codehaus.janino,org.slf4j;version="1.6",org.xml.sax,org.xml.sax.helpers,sun.reflect

确定将所有这些不必要的东西部署到karaf以解决它们并不是一个好方法。

有什么问题或者如何构建一个包含所有日志记录依赖项的捆绑包?

2 个答案:

答案 0 :(得分:0)

实际上,我认为不需要创建这样的捆绑包。 Pax Logging receives its configuration via the Configuration Admin Service。因此,您可以从任何捆绑包更新该配置。不需要重新包装。

答案 1 :(得分:0)

只需在指定位置创建包含配置数据的包(例如/configuration/configuration.json中的JSON文件)。然后创建一个扩展程序,在更改软件包时读取此数据并更新配置admin。

我写了这样一个扩展器,你可以找到它http://jpm4j.org/#!/p/osgi/aQute.configurer?tab=readme

源代码包含在JAR中:http://repo.jpm4j.org/rest/bundle/51C83986E4B06EF1574B84F7/c9256d19f155d699ed0d18559bbb80441ac68ff7