从logs4j禁用freemarker日志

时间:2014-12-16 15:48:26

标签: struts2 freemarker log4j2

Similar question但我正在使用log4j2。

我需要一种方法来禁用来自freemarker的所有日志,在documentation他们说我们可以通过调用Logger.selectLoggerLibrary(Logger.LIBRARY_NONE)来执行此操作,但他们会说

  

必须提前调用selectLoggerLibrary,然后FreeMarker才能记录任何内容,否则就不会产生(一致)效果。

我在struts2应用程序中将其称为何处? (我尝试在我的动作类中使用prepare()方法调用它,但它不起作用。)或者还有其他方法可以禁用日志吗?

2 个答案:

答案 0 :(得分:4)

问题是,你为什么要这样禁用它?

你不应该那样,所以我想这就是真正的问题所在。有某种故障吗?因为如果没有,为什么不在记录器配置中设置freemarker记录器类别?这是正常的做法,FreeMarker与否。

无论如何,在2.3.22(预计在2015年初发布)中,您可以使用启动JVM的-Dorg.freemarker.loggerLibrary=none(即,设置org.freemarker.loggerLibrary系统属性)。否则,如果您可以在ServletContextListener中调用该方法,那肯定足够早。

<强>更新

对评论作出反应...在大多数应用程序中,您将拥有使用各种日志记录和#34;框架的第三方库,如SLF4J,commons-logging,JUL,Log4j,Log4j2。因此,您必须确保将所有这些重定向到同一个记录器库中,在您的情况下肯定是Log4j2。我怀疑在你的情况下没有正确完成,所以现在多个记录器库登录到控制台,每个记录器库都有自己的配置设置。

如果FreeMarker 2.3.x检测到org.apache.log4j.Logger存在,则使用Log4j 1.x.它也可以检测和使用的其他记录器库(Log4j2不在其中)具有较低的优先级。 (FreeMarker 2.4.x将始终使用SLF4J。)因此,如果您向依赖项添加org.apache.logging.log4j:log4j-1.2-api,则FM将使用org.apache.log4j.Logger,因此log4j-1.2.-api将将FM日志消息重定向到Log4j2。这对我有用,使用这个Log4j2配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n" />
    </Console>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="Console" />
    </Root>
    <Logger name="freemarker" level="off">
      <AppenderRef ref="Console" />
    </Logger>
  </Loggers>
</Configuration>

答案 1 :(得分:-1)

使用此声明:

freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_NONE);