Similar question但我正在使用log4j2。
我需要一种方法来禁用来自freemarker的所有日志,在documentation他们说我们可以通过调用Logger.selectLoggerLibrary(Logger.LIBRARY_NONE)
来执行此操作,但他们会说
必须提前调用selectLoggerLibrary,然后FreeMarker才能记录任何内容,否则就不会产生(一致)效果。
我在struts2应用程序中将其称为何处? (我尝试在我的动作类中使用prepare()
方法调用它,但它不起作用。)或者还有其他方法可以禁用日志吗?
答案 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);