从 logs4j 禁用 freemarker 日志

Posted

技术标签:

【中文标题】从 logs4j 禁用 freemarker 日志【英文标题】:Disable freemarker logs from logs4j 【发布时间】:2015-02-14 23:46:35 【问题描述】:

Similar question 但我使用的是 log4j2。

我需要一种方法来禁用来自 freemarker 的所有日志,在他们的 documentation 他们说我们可以通过调用 Logger.selectLoggerLibrary(Logger.LIBRARY_NONE) 来做到这一点,但他们说

selectLoggerLibrary 必须在 FreeMarker 可以记录任何内容之前及早调用,否则它将没有(一致的)效果。

在 struts2 应用程序中我应该在哪里调用它? (我尝试在我的操作类中使用prepare() 方法调用它,但它不起作用。)或者有没有其他方法可以禁用日志?

【问题讨论】:

我知道它很晚,它可能会帮助某人***.com/questions/50794195/… 【参考方案1】:

使用这个语句:

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

【讨论】:

这已被弃用。能否提供更新后的代码?【参考方案2】:

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

你不应该需要那个,所以我想这就是真正的问题所在。有什么故障吗?因为如果没有,为什么不在记录器配置中设置 freemarker 记录器类别被忽略?这是执行此操作的正常方式,无论是否使用 FreeMarker。

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

更新:

响应 cmets... 在大多数应用程序中,您将拥有使用各种日志记录“框架”的 3rd 方库,例如 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="%dHH:mm:ss.SSS %-5level %logger36 - %msg%n" />
    </Console>
  </Appenders>
  <Loggers>
    <Root level="debug">
      <AppenderRef ref="Console" />
    </Root>
    <Logger name="freemarker" level="off">
      <AppenderRef ref="Console" />
    </Logger>
  </Loggers>
</Configuration>

【讨论】:

嗯...如果你们需要解决方案,那么也许您应该详细说明问题所在,而不是仅仅投反对票。而且,如果它是一个错误,或者某种不兼容,我也可以修复它。 谢谢!从ServletContextListener 拨打电话有效。不知道为什么,但我无法在 log4j2.xml 中配置它应该被忽略,尝试了我在网上找到的每一件事。听起来 freemarker 忽略了我的 log4j2 的配置......所以从 ServletContextListener 禁用是迄今为止唯一的选择。 糟糕!我第一次看到答案来自移动应用程序,我看到它有一个反对票,现在从桌面我想接受答案并赞成,我看到我是反对票,这肯定是一个错误,但它不会让我支持或删除它,因为它在 3 小时后...... @ElyeM。现在你可以把你的反对票变成赞成票(你可以通过编辑帖子来恢复/删除旧票)......并为 ddekany +1 以维护 FreeMarker :) 谢谢,赞成,@ddekany 您是否使用 log4j2.xml 配置了一次 FreemMaker,因此应该忽略日志?我宁愿在那里做,但它不起作用。

以上是关于从 logs4j 禁用 freemarker 日志的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Rspec 输出禁用 http 日志?

从 Maven 禁用休眠日志记录

c_cpp 从ubuntu中禁用hfsplus卷日志

绕过 FreeMarker 缓存?

如何禁用/关闭Storm的日志记录功能

freemarker 浏览页面可以是“用户”可编辑和安全的吗?