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

Log4j被OSGI撞了一下腰

阅读更多
  
       自从n多年前使用log4j起,印象中就没有觉得Log4j有什么太折磨人的问题,稍微复杂些的可能就是扩展自己的Appender。
       不过这一次是碰到了一个比较棘手的“麻烦”。这个麻烦并不是因为难,而是遇到之前不曾注意到问题,被Log4j不小心撞了一下腰,还挺酸疼的。
 
       之前使用Log4j非常简单,因为大多都是在同一个ClassLoader或ContextLoader中,所以只需要把log4j.xml或log4j.properties文件仍到classpath中即可(尽量是在某一个lib目录下),因为Log4j的LogManager会自动寻找和配置。当然,尽量不把log4j的配置文件放在jar中,这种做法不便于后期客户维护和更新。
       后来apache推出的commons-logging让这个简单了一些,但无非多配置一个logging.properties文件。
       再后来SLF4J让log操作变的更为简易,只需要动态替换不同的jar包即可轻松实现部署时候的日志处理包的替换。并且支持commons-logging。
 
       于是,在不同的组件包中,在一些需要记录日志的类中,我们一般会用commons-logging的Log类,于是就会在这些类的前面,增加上一行诸如此的代码:
       Log log = LogFactory.getLogger(<your_class>);
 
       可如今,我们的Framework面临基于OSGI进行重组,各个组件都变成了plugin。但是,正因为这个osgi的框架存在,让单个classloader变的不再起作用。因为OSGI里面的各个Bundle是有独立的 ClassLoader来进行加载的。
       我们总不能在每一个bundler中去放一个log4j.properties文件,这是不现实的。
       在javaeye论坛上,也有人讨论过此类问题,但是解决的办法有些简单。参见:http://www.iteye.com/post/333171 
 
       虽然可以把log4j做成一个plugin,并把log4j.properties文件放在这个plugin中,利用SLF4J在OSGI环境下动态配置。但这是一个不能采用的方式,并不是技术上实现不了,而是业务上不允许。因为未来客户可能会从update站点更新这些boudles,而且可能还需要手工修改log4j的配置。
      
       于是,想到了利用log4j.configuration这个System Property变量进行控制。Log4j允许你利用这个变量来硬性指定log4j配置文件的URL地址。
       System.setProperty("log4j.configuration", "file:///D:/tibco/config/log4j.properties");
 
       好像这个问题解决了哦,但是并没有这么简单。
       在我们开发的产品组件中,有很多command命令,每个命令都有一个自己规范的.tra文件来设置环境信息。那么这意味这我们需要在这些.tra文件中都增加一行对这个log4j.configuration变量的声明。
 
       于是有的开发人员提出,这种方式对客户并不是很友好。我们可以允许客户自己手工设置这个变量来指定所采用log4j配置文件,但我们应该提供默认的,而且这个默认配置是不应该显示的展现出来,所以我们应该在一些主要的组件中利用代码来控制,如果客户没有额外配置的化,那么应该利用代码“透明化”的配置,对客户透明的。当然这个也必须遵循统一的规范,比如默认的log4j配置文件放在某一个默认目录下。
 
       这个想法是好的,而且不难实现,因为利用Log4j自带的Configurator实现类可以很轻松的实现这样的额外配置。
       PropertyConfigurator.configure("D:/tibco/config/log4j.properties ");
 
       但是,很不幸运,我们并没有把所有的command都转换成osgi的方式,有一些因为特殊原因不支持plugin机制(比如存在一些早期的组件,利用反射形成相互的依赖关系,但OSGI是不支持相互依赖的)。
       这个时候怎么办呢?
       因为我们track了半天Log4j的代码,也没有找到如何判断“当前的Log4j已经配置过了,不需要再配置了”。否则,就会很容易造成配置冲突。有可能存在同一个classloader中,有些组件都采用了log4j的Congfigurator来进行“透明化”配置,但是这些透明化配置因为无法判断log4j是否已经初始化,而造成重复配置、覆盖配置的问题。
       目前这个问题的解决方案还在和美国那边协商,解决方案尚未最后定。
 
       是因为我们为客户考虑的太多,而把Log4j问题想复杂了;还是因为以前陈旧的代码阻碍了我们;抑或是OSGI的机制还有待改善。总之,这一次,Log4j被OSGI撞了一下腰,我们是被撞了一下腰。
 
分享到:
评论

相关推荐

    log4j-2.17升级版本包

    log4j-2.17升级版本包,包括log4j-1.2-api-2.17.1.jar、log4j-api-2.17.1.jar、log4j-core-2.17.1.jar、log4j-slf4j-impl-2.17.1.jar、log4j-web-2.17.1.jar

    OSGi中使用log4j

    NULL 博文链接:https://ouyanggod.iteye.com/blog/1335233

    eclipse log4j 插件

    **Eclipse Log4j 插件详解** 在Java开发中,日志管理是不可或缺的一部分,Log4j作为一款广泛使用的日志记录框架,为开发者提供了强大的日志处理能力。Eclipse IDE,作为Java开发的主流工具,也支持通过插件的形式...

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

    【标题】"killbill-osgi-bundles-lib-slf4j-osgi-0.8.4.zip" 是一个基于OSGi的 Kill Bill 库,其中包含了SLF4J(Simple Logging Facade for Java)的OSGi兼容版本。SLF4J是一个为各种日志框架提供简单抽象的接口,...

    SpringDM笔记6-Fragment及配置Log4j Fragment Bundle

    在本文中,我们将深入探讨Spring DM(现在称为Spring OSGi)中的Fragment Bundle以及如何配置Log4j在Fragment Bundle中的应用。Spring DM是Spring框架在OSGi(Open Service Gateway Initiative)环境下的扩展,它...

    slf4j-1.7.21所有相关jar包

    该压缩包中包含以下内容: 1、jcl-over-slf4j-1.7.21.jar 2、jcl-over-slf4j-1.7.21-sources.jar 3、jul-to-slf4j-1.7.21.jar 4、jul-to-slf4j-1.7.21-sources.jar 5、log4j-over-slf4j-1.7.21.jar 6、log4j-over-...

    最新slf4j-1.7.25.zip源码和jar包

    1.7.21-sources.jar 7、osgi-over-slf4j-1.7.21.jar 8、osgi-over-slf4j-1.7.21-sources.jar 9、slf4j-android-1.7.21.jar 10、slf4j-android-1.7.21-sources.jar 11、slf4j-api-1.7.21.jar 12、slf4j-api-1.7.21-...

    考试系统源码java-org.ops4j.pax.logging:OSGi日志框架实现。支持SLF4J、LOG4J、JCL等

    pax-logging-log4j2 (log4J2) pax-logging-logback (logback) pax-logging-log4j1在 2.0.0 版本之前被命名为pax-logging-service 。 不同的日志 API 基本接口org.osgi.service.log.LogService从OSGi的纲要规范的第...

    最新slf4j-1.7.21.zip源码和jar包

    5、log4j-over-slf4j-1.7.21.jar 6、log4j-over-slf4j-1.7.21-sources.jar 7、osgi-over-slf4j-1.7.21.jar 8、osgi-over-slf4j-1.7.21-sources.jar 9、slf4j-android-1.7.21.jar 10、slf4j-android-1.7.21-...

    四大OSGI框架最新技术对比分析

    四大OSGI框架最新技术对比分析 一、Apache Felix ### 1.1 概述 Apache Felix 是一个致力于实现 OSGi R4 Service Platform 和其他与 OSGi 相关的技术的社区项目,遵循 Apache 许可。最初,OSGi 规范的目标是嵌入式...

    spring osgi相关资源

    4. 依赖库:包括了对Apache Felix或Equinox等OSGi容器的适配器,以及一些基础库,如log4j、commons-lang等。 综上所述,Spring OSGi结合了Spring的便利性和OSGi的模块化优势,为Java企业级应用提供了一种高效、灵活...

    opcua4j-osgi:完整的OSGi-fied OPCUA4j库

    "opcua4j-osgi"是这个库的OSGi兼容版本,意味着它已经被调整为在OSGi(开放服务网关倡议)框架中运行,这是一个灵活的Java模块化系统,常用于企业级应用和设备。 在OSGi环境中,opcua4j-osgi库使得开发人员能够创建...

    osgi介绍osgi介绍

    在OSGi中,应用程序被分解为称为“bundle”的独立单元,这些bundle可以相互依赖并独立地加载、启动、更新和卸载,而无需重启整个系统。OSGi的核心理念是促进组件化开发,提高软件的可维护性、可扩展性和可重用性。 ...

    OSGI 开发文档中文的

    它提供了一种灵活的框架,使得开发者可以构建、部署和管理模块化组件,这些组件被称为服务或bundle。OSGI的核心理念是将应用程序分解为独立的、可交互的单元,这样可以方便地进行版本控制、依赖管理和动态更新。 在...

    OSGi R4规范,中文版

    Bundle是OSGi中的基本单元,可以独立于其他组件被安装、启动、更新或卸载。这种模块化的结构使得应用程序能够轻松地进行扩展和维护。 ##### 2.2 动态性 在OSGi R4中,所有的服务都是动态的。这意味着服务可以在...

    OSGI 实例eclipse插件开发

    4. `org.springframework.osgi.extender`:这是Spring OSGI扩展器,它允许在OSGI环境中启动和管理Spring应用上下文。它监控bundle的生命周期,并在适当的时候初始化和销毁Spring应用上下文。 5. `osgi_serviceImpl`...

    OSGI规范中文版

    4. **版本化**:OSGi框架支持对Bundle的版本控制,使得同一系统中可以共存同一个组件的多个版本。 5. **安全**:OSGi框架提供了安全机制,用于控制Bundle的执行权限和资源访问权限。 ### OSGi核心标准 OSGi核心...

    OSGI 入门资料PDF

    在实践中,OSGI被广泛用于大型复杂项目,如企业级应用、嵌入式系统和设备。例如,通过OSGI,开发者可以在不重启整个应用的情况下更新或修复某个功能模块。这大大提高了系统的可靠性和维护效率。学习OSGI实战,你...

Global site tag (gtag.js) - Google Analytics