在osgi中应用log4j(二)

本文探讨了在OSGi环境中正确配置Log4j的方法,解决了因ClassLoaders不一致导致的日志记录问题。通过调整ClassLoader环境,确保了Log4j能够正确加载配置并输出日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在上一篇中,利用了Proxy和在Bundle中加载jar包的方法,对其他的bundle输出log4j的服务,应用log4j输出日志。但是在其中,是回避了在osgi整个环境中加载log4j的问题。从而带来的问题是,在系统应用的其他的框架,利用log4j输入的日志,无法正确的显示出来,这带来了很多的问题,特别是在系统调试时,因为看不到所用框架的日志,就无法正确的判断系统的运行状况。所以,在osgi的整个环境中加载log4j,就显得非常重要了。

      在单纯的osgi环境中,利用log4j自带的配置文件读写工具,读写log4j.xml文件,加载日志配置是可以的:

		DOMConfigurator.configure("log4j.xml");

 

但是当把osgi环境嵌入到其他应用程序执行时,就会报一个Appender不能够cast的错误,这个问题是由于osgi环境的host有一个自己的classLoader的环境,其中(很多情况下)是已经加载了log4j的应用类的,当在bundle中开始加载配置时,会首先获得已经实例化的对象,此时就会出现cast的问题。

    解决这个问题的方法,是让bundle在自己的classloader体系中,加载所需要的对象,所以,要把读配置文件的classloader环境设置为bundle的classloader环境:

		ClassLoader cl = Thread.currentThread().getContextClassLoader();
		Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
		DOMConfigurator.configure("log4j.xml");

		Logger log = LogManager.getLogger(this.getClass());

		System.out.println("hello,test slf4j");
		log.debug("hello world. this is slf4j log test.");
		Thread.currentThread().setContextClassLoader(cl);

 这样就可以在整个osgi环境中,加载log4j的配置,所以应用log4j日志输出的osgi bundle的日志可以正常控制了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值