OSGi中使用log4j

最近在看关于OSGi方面的内容,自己做了些简单的例子。虽然在log方面OSGi有提供一些实现,但我们javaer们早已习惯了log4j,于是很想试试看log4j在OSGi上能不能用。

在网上搜了下,相关的资料不多也不少,但都不是很详细,所以记下来,方便大家参考一下。

例子用到了:
  • apache的felix(版本4.0.2)
  • springDM(版本1.2.1)中的log4j的jar包。

首先,实现一个bundle类:
public class Activator implements BundleActivator
{
    private static final Logger log = Logger.getLogger(Activator.class);

    public void start(BundleContext context)
    {
        log.info("Starting our bundle.");
    }

    public void stop(BundleContext context)
    {
        log.info("Stopping our bundle.");
    }
}

代码十分简单,仅仅是为了看看我们的log是否都工作,接着准备相应的manifest.mf文件:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_29-b11-402-11M3527 (Apple Inc.)
Bundle-Name: LogTest
Bundle-Description: A bundle that test logging
Bundle-Vendor: OuYang
Bundle-Version: 1.0.0
Bundle-Activator: tutorial.example1.Activator
Bundle-ManifestVersion: 2
Import-Package: org.osgi.framework,org.apache.log4j
Bundle-SymbolicName: exampleOne

因为用到了log4j,所以Import-Package中加上了org.apache.log4j,接着把上面的Activator.class文件和manifest.mf文件打包成jar文件(命名为example1.jar)。

要在OSGi中使用log4j,需要在一个单独的bundle中提供log4j.properties文件,并且这个bundle要定义成fragment的,先看manifest.mf文件:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_29-b11-402-11M3527 (Apple Inc.)
Bundle-ManifestVersion: 2
Bundle-SymbolicName: Log4JProperties
Fragment-Host: org.springframework.osgi.log4j.osgi

上面的Fragment-Host: org.springframework.osgi.log4j.osgi表示这个bundle是fragment的,它的主bundle是org.springframework.osgi.log4j.osgi,也就是springDM中的log4j这个jar包了。

接着准备一个log4j.properties文件:
log4j.rootLogger=INFO, stdout, R
log4j.logger.tutorial=INFO

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d]-%-5p %t | %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/Users/ouyang/logs/osgi-new-test.log
log4j.appender.R.MaxFileSize=5000KB
log4j.appender.R.MaxBackupIndex=5
log4j.appender.R.Threshold=DEBUG
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[%d]-%-5p %t | %m%n

接着把manifest文件和log4j.properties文件打包成jar文件(命名为log-bundle.jar)。

最终生成的两个bundle的结构如下:
example1.jar
  --tutorial.example1
   --Activator.class
  --MATE-INF
    --MANIFEST.MF

log-bundle.jar
  --MATE-INF
    --MANIFEST.MF
  --log4j.properties

最后启动felix,安装并启动相关的bundle,就可以看到log 信息被成功的输出了。
g! install file:///Users/ouyang/Desktop/123/log4j.osgi-1.2.15-SNAPSHOT.jar
Bundle ID: 5
g! install file:///Users/ouyang/Desktop/123/log-bundle.jar
Bundle ID: 6
g! install file:///Users/ouyang/Desktop/123/example1.jar
Bundle ID: 7
g! lb
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (4.0.2)
    1|Active     |    1|Apache Felix Bundle Repository (1.6.6)
    2|Active     |    1|Apache Felix Gogo Command (0.12.0)
    3|Active     |    1|Apache Felix Gogo Runtime (0.10.0)
    4|Active     |    1|Apache Felix Gogo Shell (0.10.0)
    5|Installed  |    1|log4j.osgi (1.2.15.SNAPSHOT)
    6|Installed  |    1|Log4JProperties (0.0.0)
    7|Installed  |    1|Service listener example (1.0.0)
g! start 7
[2012-01-04 17:09:43,974]-INFO  Gogo shell | Starting our bundle.
g! stop 7
[2012-01-04 17:09:49,151]-INFO  Gogo shell | Stopping our bundle.
g!

你可能感兴趣的:(java,log4j,osgi,logging,felix)