在使用freemarker 的过程中出现了freemarker的日志和应用本身的日志包使用的不是同一个,看起来很乱,收到下面这篇文章:
I’ve just spent three hours trying to get Freemarker to stop spitting out “DEBUG cache:81” messages in my Spring application.
Freemarker recently hacked in SLF4J support into 2.3, but I had a hard time finding out how to enable it, so I reckoned I’d share my experiences.
FreeMarker 2.3 looks for logging libraries in this order (by default) with the class-loader of the FreeMarker classes: Log4J, Avalon, java.util.logging. The first that it founds in this list will be the one used for logging.
I found out that you can override this behavior in 2.3.18 by calling:
freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_SLF4J);
After trying a few different tricks, such as having a load-on-startup Servlet’s init() configure the logger, I ended up with a fairly clean solution.
I extended Spring’s FreeMarkerConfigurer class like this:
public class PluxFreeMarkerConfigurer extends FreeMarkerConfigurer {
private Logger logger = LoggerFactory
.getLogger(PluxFreeMarkerConfigurer.class);
@Override
public void afterPropertiesSet() throws IOException, TemplateException {
fixFreemarkerLogging();
super.afterPropertiesSet();
}
private void fixFreemarkerLogging() {
try {
freemarker.log.Logger
.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_SLF4J);
logger.info("Switcheden Freemarker logging to slf4j");
} catch (ClassNotFoundException e) {
logger.warn("Failedwitch broken Freemarker logging to slf4j");
}
}
}
<!-- FreeMarker engine that configures Freemarker for SLF4J-->
<bean id="freemarkerConfig" class="com.selessia.plux.web.PluxFreeMarkerConfigurer"
...
</bean>
转自:https://stnor.wordpress.com/2011/05/26/freemarker-slf4j-and-spring/
其实还有别的办法,那就是官方文档里面写的 java … -Dorg.freemarker.loggerLibrary=SLF4J
官方说从 FreeMarker 2.4 版本开始SLF4J有自动检测的最高优先级,但是2.4在哪。。。。
对于2.3.X:
简而言之,在现代(比如2015年)的应用程序中, 记录日志推荐使用SLF4J API。 要让 FreeMarker 2.3.x. 使用SLF4J,在项目中加入依赖 org.slf4j:log4j-over-slf4j 即可, 要确保 log4j:log4j 不能存在。(从 FreeMarker 2.4.x 开始,尽管没有什么害处, 但也不再需要 log4j-over-slf4j 了。)
如果你对这些细节好奇,或者不能使用SLF4J,那么就继续阅读吧...
FreeMarker 整合了如下的日志包:SLF4J,Apache Commons Logging,Log4J 1.x,Avalon LogKit 和 java.util.logging。默认情况下, FreeMarker(在2.3.x版本下)会按如下顺序来查找日志包, 而且会自动使用第一个发现的包: LOG4J(从2.3.22开始,如果正确安装了log4j-over-slf4j,则会使用SLF4J来代替), Apache Avalon LogKit, java.util.logging。 正如你所见,Log4j有最高的优先级。org.apache.log4j.Logger 类会检测Log4j的存在,那么也就是说,像log4j-over-slf4j 或 log4j-1.2-api,Log4j重定向也会有最高优先级。
在 FreeMarker 2.4 版本之前,因为向后兼容性的限制, SLF4J和Apache Commons Logging不会被自动搜索。但是如果你正确安装了 org.slf4j:log4j-over-slf4j(也就意味着, 在类路径下没有真实的Log4j,SLF4J有一个像 logback-classic 的支持实现),那么FreeMarker会直接使用SLF4J API来代替Log4j API (从FreeMarker 2.3.22版本开始)。
一个关键点是 要确保 log4j:log4j 不能存在。
找到并删除所有log4j即可,无需添加log4j-over-slf4j。