分离Freemarker的日志, slf4j and spring

在使用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。

# 日志 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×