知识前提:
一点maven知识,熟悉pom.xml的基本配置方法。
了解springDM的大致原理。
参考:
common logging 和 log4j 的关系 : http://touch.iteye.com/blog/31632
slf4j : http://imshare.iteye.com/blog/772770
springdm下解决log4j问题: http://www.blogjava.net/gordon/articles/333799.html
一、spring dm中几个log相关jar包的关系
通过查看这几个包的MENIFEST.MF文件,可以大概了解他们之间的关系。
1、 com.springsource.slf4j.org.apache.commons.logging依赖com.springsource.slf4j.api
根据参考1和参考2的说法,slf4j抽象出公共的日志接口,屏蔽了日志实现系统的细节;commons.logging优化了适应性,可以自动找到最优的日志实现。总之,两个都是日志调用的公共接口,既然commons.logging要在slf4j上面做封装,那么自然是有点用的,就用它了。
2、com.springsource.slf4j.api接受fragment形式的实现
比如想要log4j实现日志记录,那么就附着一个com.springsource.slf4j.log4j,如果想要jdk实现,那么附着一个slf4j-jdk就好了(osgi环境下这个包有没有得去找找看)。
3、com.springsource.slf4j.log4j只是作为一个实际实现的适配器,真正的实现者是com.springsource.org.apahce.log4j
也就是说,com.springsource.slf4j.log4j依赖com.springsource.org.apahce.log4j的实现,并附着到com.springsource.slf4j.api上面去。
4、log4j这个日志系统实现者,本身是不提供配置的,通常是用fragment的形式,把配置文件附着上去。下面就描述怎么编译这个fragment。
二、实现log4j配置
配置文件log4j.properties到处都有,这里贴一份拷贝过来的,看着意思改一下输出文件就可以用了,直接放到project下面:
log4j.rootLogger=INFO, stdout, R
log4j.logger.tutorial=INFO
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d]-%-5p %t | %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=D:/osgi-new-test.log
log4j.appender.R.MaxFileSize=5000KB
log4j.appender.R.MaxBackupIndex=5
log4j.appender.R.Threshold=DEBUG
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[%d]-%-5p %t | %m%n
编译这个fragment的时候,有点要注意的,这里记一下pom.xml文件里面的东西
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.4.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>logfrag</Bundle-SymbolicName>
<Export-Package></Export-Package>
<Bundle-Vendor>haha</Bundle-Vendor>
<Include-Resource>log4j.properties</Include-Resource>
<Fragment-Host>com.springsource.org.apache.log4j;bundle-version="[1.2.15,1.2.15]"</Fragment-Host>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
Fragment-Host这一项,后面填的是主Bundle的Bundle-SymbolicName,可以填bundle-version做过滤,也可以不填。
Include-Resource这一项,如果不填,maven-bundle-plugin就只会打包class文件,生成MENIFEST.MF文件,不会把log4j.properties加进去,所以要这么一个配置。
三、调用commons.logging接口记日志
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
private static Log log = LogFactory.getLog(Activator.class);
log.error("log test OK !!!!!!!!!!!!");
四、庆祝环境搭建成功