`

在osgi中应用log4j(二)

    博客分类:
  • osgi
阅读更多

 在上一篇中,利用了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的日志可以正常控制了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics