欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OSGI - Log4j配置

程序员文章站 2022-03-09 14:04:01
...
关键字: log4j slf4j
       由于OSGi每个Bundle都有自己的独立的类加载器,所以如果将Log4j的配置放到一个Bundle中,是不能被其他Bundle共享的,而且也分散了对log的管理,显然不是太好。
       比较理想的作法就是单独建立一个Log Bundle,负责处理日志问题,包括加载、关闭、配置等。由于我的项目中涉及到Jetty、Wicket、Hibernate、Spring等这些开源的项目分别使用了Jetty和Wicket使用的是slf4j,而Spring和Hibernate使用了Apache的commons-logging,所以只好使用slf4j作为通用的日志工具,使用Log4j的实现。
       因为日志管理属于全局的,所以我将一些全局的东西都打包到一个Bundle中,方便管理。这个Bundle的主要目的就是加载Log4j的配置文件,并管理其生命周期。
       首先要添加slf4j-api-1.4.2.jar和slf4j-log4j12-1.4.2.jar,用来让slf4j使用log4j的jar包,当然也不能忘了log4j自身的jar包。新建一个CoreActivator实现BundleActivator接口:

java 代码

1.package wanged.core; 
2. 
3.import java.util.Properties; 
4. 
5.import org.apache.log4j.LogManager; 
6.import org.apache.log4j.PropertyConfigurator; 
7.import org.osgi.framework.BundleActivator; 
8.import org.osgi.framework.BundleContext; 
9. 
10.public class CoreActivator implements BundleActivator { 
11. 
12.    public void start(BundleContext context) throws Exception { 
13.        Properties props = new Properties(); 
14.        props.load(CoreActivator.class.getResourceAsStream("/log4j.properties")); 
15.         
16.        PropertyConfigurator.configure(props); 
17.    } 
18. 
19.    public void stop(BundleContext context) throws Exception { 
20.        LogManager.shutdown(); 
21.    } 
22. 
23.} 

这就完成了Log4j的加载,下面来配置log4j.properties:
        log4j.category.org.springframework=INFO,C
        log4j.category.wanged=INFO,C
        log4j.category.org.apache.wicket=INFO,C
        log4j.category.org.hibernate=INFO,C

        log4j.appender.C = org.apache.log4j.ConsoleAppender
        log4j.appender.C.Target = System.out
        log4j.appender.C.layout = org.apache.log4j.PatternLayout
        log4j.appender.C.layout.ConversionPattern = %-d{HH:mm:ss} [%p] %m%n
因为这里只涉及到Log4j的初始化和清理操作,所以在MANIFEST.MF中只需要导入org.apache.log4j。
        现在配置好了,如何使用呢?在需要使用日志的Bundle中,只需要导入包org.slf4j,就可以在程序中使用,示例如下:

java 代码

1.import org.slf4j.Logger; 
2.import org.slf4j.LoggerFactory; 
3. 
4.public class TestClass{ 
5.    private static final Logger log = LoggerFactory.getLogger(TestClass.class); 
6. 
7.    public void doThings(){ 
8.        log.info("doThings()"); 
9.    } 
10.} 
      
       当然如果不喜欢使用Log4j,可以单独修改上面的Bundle,而不会影响到其他使用Log的Bundle,是不是很方便?!