*文章概述
---osgi提供了logservice, 与一些日志框架(如log4j)相比, 它在功能和使用便捷性等各方面实在差的太远, 要用于应用程序开发使用自己还需要做很多事.
---是否可以将一个成熟的Java日志框架, 集成到插件开发中呢? 并且在插件开发中至少保证2点: 1)使用的方便性; 2)可替换性(支持公共的日志接口, 如slf4j)
我在看了logback文档后, 发现这是可行的, 并且将其集成到equinox的开发环境中.
*logback简介(官方网址:http://logback.qos.ch/)
---它是log4j作者实现的一个新日志框架, 在性能上应当更加优越, 而在配置和设计思路上基本延续了log4j的风格.
---它的代码架构更加清晰, 分为3个模块(jar):logback-core, logback-classic, logback-access.
在一些具体功能时, 需要另为的jar包, 参看它的帮助文档(http://logback.qos.ch/manual/introduction.html).
---实现了slf4j的通用日志接口, 所以应用中只需使用slf4j的接口就行.
关于这一点, 可以看到后续在插件实现中只需继承slf4j插件, 而不需依赖logback, 保证日志框架的可替换是必要的.
*集成到equinox的步骤
---将slf4j-api这个通用的日志接口插件化
1)把slf4j-api变成equinox的插件, 通常的做法是新建插件时选"Plug-in from Existing JAR Archives".
2)在MENIFEST.MF务必保证如下配置
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: slf4j-api
Bundle-SymbolicName: slf4j.api;singleton:=true
Bundle-Version: 1.6.5
Bundle-Vendor: SLF4J.ORG
Eclipse-BuddyPolicy: dependent
Export-Package: org.slf4j,
org.slf4j.helpers,
org.slf4j.spi
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.slf4j.impl
Bundle-ActivationPolicy: lazy
注意, 这里添加"Eclipse-BuddyPolicy: dependent", 以保证后续依赖slf4j插件的插件类能被slf4j的classloader找到.
关于BuddyPolicy, 详见我的另一篇文章http://www.cnblogs.com/bronte/articles/2520039.html
---新建一个equinox段插件(注意是"Fragment Project"), 名为ext.eclipse.logback, 宿主就是上面的slf4j-api插件
1)在'lib/'文件夹, 放入logback相关的jar, 并添加到插件的classpath中;
2)MANIFEST.MF中, "Export-Package: org.slf4j.impl", 这是为了让上面slf4j-api插件不至于报错
这里我觉得是不合理的, 因为是ext.eclipse.logback是slf4j-api的fragment, 2者应在同一个classloader里, 应当是无需exprot的,
故这个步骤我觉得可能是eclipse在插件依赖计算上的bug, 少做了一个检测, 没有判断是否能从fragment中找需要的包.
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Logback Plugin
Bundle-SymbolicName: ext.eclipse.logback;singleton:=true
Bundle-Version: 1.0.6
Bundle-Vendor: Ext-Eclipse
Fragment-Host: slf4j.api;bundle-version="1.6.5"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ClassPath: .,
lib/commons-compiler.jar,
lib/janino.jar,
lib/logback-access-1.0.6.jar,
lib/logback-classic-1.0.6.jar,
lib/logback-core-1.0.6.jar,
lib/jansi-1.9.jar
Require-Bundle: org.eclipse.core.runtime
Export-Package: org.slf4j.impl
3)这里使用fragment的好处
一是完全解藕了接口和实现; 二是无需在ext.eclipse.logback里export东西了, 减少export是有利于保持运行环境的整洁.
*使用步骤
---在需要使用日志的插件, 只依赖slf4j-api插件, 使用它的接口就行;
1 Logger logger = LoggerFactory .getLogger("chapters.introduction.HelloWorld1"); 2 logger.debug("{}", "Hello World.");
---在jvm启动参数中, 添加logback配置文件路径, 如"-Dlogback.configurationFile=/home/dzh/temp/logback-test.xml. "
可以在eclipse.ini文件中, 或者命令行方式启动时, 在-vmargs之后添加.
*总结
---文章结合了一些eclipse技术, 如BuddyPolicy, Fragment等, 实现将已有的Java日志框架集成到Equinox中; 目前已添加了logback, 也可以添加其他日志实现;
---可以从下面的svn地址, 下载slf4j-api和ext.eclipse.logback插件
http://ext-eclipse.googlecode.com/svn/trunk/lib