2007-08-16
给OSGi程序添加日志
关键字: 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接口:
这就完成了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,就可以在程序中使用,示例如下:
当然如果不喜欢使用Log4j,可以单独修改上面的Bundle,而不会影响到其他使用Log的Bundle,是不是很方便?!
比较理想的作法就是单独建立一个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 代码
- package wanged.core;
- import java.util.Properties;
- import org.apache.log4j.LogManager;
- import org.apache.log4j.PropertyConfigurator;
- import org.osgi.framework.BundleActivator;
- import org.osgi.framework.BundleContext;
- public class CoreActivator implements BundleActivator {
- public void start(BundleContext context) throws Exception {
- Properties props = new Properties();
- props.load(CoreActivator.class.getResourceAsStream("/log4j.properties"));
- PropertyConfigurator.configure(props);
- }
- public void stop(BundleContext context) throws Exception {
- LogManager.shutdown();
- }
- }
这就完成了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 代码
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class TestClass{
- private static final Logger log = LoggerFactory.getLogger(TestClass.class);
- public void doThings(){
- log.info("doThings()");
- }
- }
当然如果不喜欢使用Log4j,可以单独修改上面的Bundle,而不会影响到其他使用Log的Bundle,是不是很方便?!
- 12:10
- 浏览 (2243)
- 评论 (4)
- 分类: OSGi
- 进入论坛
- 发布在 Eclipse PlugIns&RCP&OSGI 圈子
- 相关推荐
评论
earls
2007-09-25
ycoe:
从BundleContext中获得就需要知道上下文环境,反而增加了耦合性。另外log本身就是公共的一个jar包,对于第三方的软件包,它们也都在使用log,而它们多数并没有基于OSGi,那么按您的做法,这第三方软件包如何来处理日志呢?
这个本来就是一个例子,并不是真正的开发代码,不需要非常的严谨,因此关于你所说的单态问题完全没有必要。
从BundleContext中获得就需要知道上下文环境,反而增加了耦合性。另外log本身就是公共的一个jar包,对于第三方的软件包,它们也都在使用log,而它们多数并没有基于OSGi,那么按您的做法,这第三方软件包如何来处理日志呢?
这个本来就是一个例子,并不是真正的开发代码,不需要非常的严谨,因此关于你所说的单态问题完全没有必要。
ycoe
2007-09-19
earls:
你这根本不能叫做一个bundle。只是把几个日志包共享而已。正确的做法应该是在start方法里面把日志进行注册,用的时候从BundleContext里面获取。而不是直接用private static final Logger log = LoggerFactory.getLogger(TestClass.class);
对于OSGi来说,它本身就是一个单态的,因此没有必要再去声明:static final
路过...
你这根本不能叫做一个bundle。只是把几个日志包共享而已。正确的做法应该是在start方法里面把日志进行注册,用的时候从BundleContext里面获取。而不是直接用private static final Logger log = LoggerFactory.getLogger(TestClass.class);
对于OSGi来说,它本身就是一个单态的,因此没有必要再去声明:static final
路过...
earls
2007-08-20
大作已阅读,确实不错,但没有解决涉及slf4j的第三方软件包的日志问题。
我们都只讨论了一部分日志的解决方案,我的文章中没有提及使用common-logging的第三方软件包的日志问题,其实上面例子中,只需要在configuration/config.ini文件中加上一句
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
就可以解决这个问题
我们都只讨论了一部分日志的解决方案,我的文章中没有提及使用common-logging的第三方软件包的日志问题,其实上面例子中,只需要在configuration/config.ini文件中加上一句
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
就可以解决这个问题
zhoufu24
2007-08-17
还不错,不过应该没有我的方便^_^欢迎交流
http://zhoufu24.javaeye.com/admin/show/100816
http://zhoufu24.javaeye.com/admin/show/100816
- 浏览: 17026 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最新评论
-
Spring、OSGi整合Hibernat ...
有几个问题,想请教一下,当其他任何bundle实现了wanged.core.pe ...
-- by jncz -
Spring、OSGi整合Hibernat ...
...
-- by hustlong -
Spring、OSGi整合Hibernat ...
基础的学习请先参考《OSGi实战》Opendoc,是入门级的,可以从blog.b ...
-- by BlueDavy -
Spring、OSGi整合Hibernat ...
引用目前OSGi还是不够成熟,支持的第三方软件也不是太多,文档也不齐全,所以学习 ...
-- by fangzhouxing -
Spring、OSGi整合Hibernat ...
我觉得fragment主要用来解决本地化问题和一些不涉及对外提供服务的扩展问题。 ...
-- by earls






评论排行榜