`
earls
  • 浏览: 69886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

给OSGi程序添加日志

    博客分类:
  • OSGi
阅读更多
       由于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,是不是很方便?!
分享到:
评论
4 楼 earls 2007-09-25  
ycoe:
从BundleContext中获得就需要知道上下文环境,反而增加了耦合性。另外log本身就是公共的一个jar包,对于第三方的软件包,它们也都在使用log,而它们多数并没有基于OSGi,那么按您的做法,这第三方软件包如何来处理日志呢?
这个本来就是一个例子,并不是真正的开发代码,不需要非常的严谨,因此关于你所说的单态问题完全没有必要。
3 楼 ycoe 2007-09-19  
earls:

   你这根本不能叫做一个bundle。只是把几个日志包共享而已。正确的做法应该是在start方法里面把日志进行注册,用的时候从BundleContext里面获取。而不是直接用private static final Logger log = LoggerFactory.getLogger(TestClass.class);
对于OSGi来说,它本身就是一个单态的,因此没有必要再去声明:static final

路过...
2 楼 earls 2007-08-20  
大作已阅读,确实不错,但没有解决涉及slf4j的第三方软件包的日志问题。
我们都只讨论了一部分日志的解决方案,我的文章中没有提及使用common-logging的第三方软件包的日志问题,其实上面例子中,只需要在configuration/config.ini文件中加上一句
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
就可以解决这个问题
1 楼 zhoufu24 2007-08-17  
还不错,不过应该没有我的方便^_^欢迎交流
http://zhoufu24.iteye.com/admin/show/100816

相关推荐

    osgi基础demo-搭建servlet

    在这个“osgi基础demo-搭建servlet”项目中,我们将探讨如何在OSGi环境中创建并运行一个简单的Servlet应用程序。 首先,我们需要理解OSGi的核心概念。OSGi基于服务导向架构,每个模块称为一个Bundle,每个Bundle...

    OSGI应用程序

    OSGI(Open Services Gateway Initiative)应用程序是一种遵循OSGi规范构建的模块化软件系统。它允许开发者将应用程序拆分成独立的、可热插拔的模块,称为服务或bundle。Eclipse Equinox是OSGI联盟规范的一个实现,...

    tomcat-osgi压缩包

    - **调试与日志**:利用OSGi提供的工具进行服务的调试和日志记录,以便于问题排查。 总之,"tomcat-osgi"的集成提供了一个强大的平台,允许开发者构建高度模块化、可扩展和动态的Java应用程序。通过深入理解和熟练...

    OSGI常用通信实例

    使用OSGI的开发和调试可能涉及到命令行工具(如`osgish`),日志查看器来跟踪服务生命周期,以及特殊的调试器或插件。理解如何有效地利用这些工具对于理解和解决问题至关重要。 通过学习这个实例,开发者不仅能...

    spring-osgi 入门手册和代码

    - **灵活性**:Spring OSGi 可以与现有的 Spring 应用集成,同时利用 OSGi 的优势,提高应用程序的灵活性和可扩展性。 3. **开始使用 Spring OSGi** - **环境准备**:安装一个 OSGi 容器,如 Apache Felix 或 ...

    osgi gemini blueprint环境

    3. **环境搭建**:包括安装和配置OSGi运行时环境(如Equinox或Felix),以及添加Gemini Blueprint相关的库和依赖。 4. **服务组件定义**:描述如何使用XML或注解定义Blueprint服务组件,包括服务接口、实现类和元...

    OSGi基本原理pdf (by 静默虚空 )

    模块化在OSGi中是通过为Jar包添加元数据(metadata)来实现的。元数据定义了哪些类应该被暴露给其他模块,哪些类应该隐藏。因此,jar包的物理边界也成为了运行时逻辑模块的封装边界。每个OSGi的模块被称作一个Bundle...

    OSGISpring OSGISpring

    OSGI是一种模块化系统和Java应用程序执行环境,它允许开发者将应用程序分解为独立的服务组件,而Spring是Java企业级应用开发的主流框架,提供依赖注入和面向切面编程等功能。 描述中的"OSGISpringOSGISpring"可能是...

    WPF树状界面-OSGI.net

    标题“WPF树状界面-OSGI.net”暗示了这是一个关于Windows Presentation Foundation(WPF)应用程序的开发主题,其中涉及到使用OSGI(Open Services Gateway Initiative)框架来构建用户界面,特别是树形结构的展示。...

    osgi-jetty-9.3.10环境配置-注册Servlet工程示例

    OSGi(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用程序按需加载和卸载组件,实现动态的、可插拔的架构。Jetty是一款轻量级、高性能的HTTP服务器和Servlet容器,它能够直接在OSGi...

    killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip

    bundles-lib-slf4j-osgi-0.8.4.zip" 和 "java-goinstant-auth.zip" 分别涉及了OSGi模块化、日志抽象和实时协作领域的技术,都是Java开发中的重要工具,尤其适用于构建复杂、模块化且需要安全协作功能的应用程序。

    OSGI原理与最佳实践(附简下载)

    它最初是为了家庭网络环境中的服务集成而设计,但随着时间的发展,OSGI已经成为Java平台上的一个强大模块化系统,广泛应用于企业级应用、嵌入式系统和设备驱动程序开发。 ### OSGI的核心概念 1. **模块系统**: ...

    OSGi与Equinox 创建高度模块化的Java系统 第4章完整源码

    OSGi(Open Services Gateway Initiative)是一种Java平台的模块化系统,它允许开发人员将应用程序分解为独立、可重用的模块,称为服务。Equinox是IBM贡献给Eclipse基金会的一个OSGi实现,它是Eclipse IDE的基础,...

    可运行的OSGI实例

    7. **调试和日志**:了解如何在OSGI环境中进行调试,以及如何设置和查看模块的日志输出。 8. **框架选择**:对比Equinox和Felix等不同OSGI实现,了解它们的差异和适用场景。 通过深入研究和实践这个可运行的OSGI...

    OSGI错误分析解决

    在OSGI中使用数据库通常涉及创建JDBC驱动服务,确保驱动bundle与应用程序的其他部分正确交互,并且在需要时能够动态地添加、更新或移除数据库连接。 总结来说,解决OSGI错误涉及理解其模块化架构,正确配置服务和...

    osgi 实践 总结

    6. **开发Fragment插件**:Fragment Bundle用于增强其他bundle的功能,例如添加新的日志格式支持。 7. **集成测试**:编写测试用例,验证各模块之间的交互和功能正确性。 8. **启动与打包发布**:理解OSGI容器的启动...

    osgi进阶

    - **调试和日志**:如何有效地调试OSGi环境下的问题,以及如何集成日志框架进行日志记录。 - **部署和打包**:如何正确打包和部署bundle到OSGi容器,以及如何处理bundle间的依赖关系。 - **远程服务**:了解OSGi ...

Global site tag (gtag.js) - Google Analytics