【问题标题】:Apache Velocity 2.0 - log binding issue?Apache Velocity 2.0 - 日志绑定问题?
【发布时间】:2018-03-13 13:36:46
【问题描述】:

我正在使用 Apache Velocity 2.0。我正在尝试设置 slf4j 绑定。如 Apache Velocity 文档中所述,我设置了所需的依赖项。 这样完成并说我现在期望使用 NOPLogger 因为没有任何日志使用情况。我的代码如下:

// Get template engine
VelocityEngine templateEngine = new VelocityEngine();

// Init template engine
templateEngine.addProperty(RuntimeConstants.RUNTIME_LOG_INSTANCE, new NOPLoggerFactory().getLogger(""));
templateEngine.init();

我的问题是执行“new VelocityEngine();”我在调试器控制台中得到以下跟踪:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [bundleresource://23.fwk288994035:3/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [bundleresource://23.fwk288994035:8/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]

???

我看了一下 Apache 源代码:

public class VelocityEngine implements RuntimeConstants
{
    private RuntimeInstance ri = new RuntimeInstance();
....
}

public class RuntimeInstance implements RuntimeConstants, RuntimeServices
{
/**
* The Runtime logger.  The default instance is the "org.apache.velocity" logger.
*/
    private Logger log = LoggerFactory.getLogger(DEFAULT_RUNTIME_LOG_NAME);
....
}

对我来说听起来,所以记录器是获取优先集成商获取指定它的能力... 在我的环境中。我可能已经运行了一些其他记录器(我依赖的第三方贡献),所以我得到了如此无聊的跟踪。

我的分析可以吗?有什么技巧可以分享一下解决问题?

【问题讨论】:

  • 你的 slf4j jar 是什么?
  • 我已经添加了 sl4j-api 和 sl4j-simple jars 作为 Apache 的velocity 的插件。由于期望到那时设置 NOPLogger 我已经尝试删除 sl4j-simple 一个但当时速度失败了....思考问题总是相同的速度是需要记录器事先提供定义它的能力...所以记录器查找器正在运行...

标签: java logging velocity


【解决方案1】:

如果你需要在类路径中保留 slf4j-simple,你只需不能同时添加 slf4j-nop jar。

类路径中根本不能有两个 slf4j 绑定 jar。

您需要通过configuring the SimpleLogger 关闭 Velocity 日志。

例如,您可以定义以下系统属性:

org.slf4j.simpleLogger.log.org.apache.velocity = off

【讨论】:

  • 提供了 org.slf4j.helpers.NOPLogger 感谢 sl4j-api.jar 不需要额外的 sl4j-nop.jar。 sl4j-api.jar 是速度的强制性要求。我尝试同步设置系统属性。根据您的建议,但结果相同......仍然收到绑定警告。我已经在我的第三方插件中寻找其他现有的绑定,以确保 log4j 存在。
  • 警告指出有两个 slf4j 实现,所以在你的类路径中一定有一个隐藏的地方......
  • 肯定有。一些第三方插件依赖于绑定到 log4j。不幸的是,我无法控制此类插件对类路径的贡献。我可能没问题,遗憾的是这样的插件不允许控制记录器,但返回速度声音给我适当的材料可供集成商设置记录器,除非在考虑此类设置之前使用记录器...
  • 作为一个尝试,我有 Apache 速度源。我已经破解了 RuntimeInstance.class,只有在 initializeLog() 调用后才使用记录器。我已经建立了一个velocity.jar。依靠这种 hack,保持我的原始代码设置 RuntimeConstants.RUNTIME_LOG_INSTANCE 属性在 init() 之前为我提供了预期的结果......仍在考虑当前速度代码中的一些问题同步。与我的第一次猜测分析或明确的我错过的东西。如果有请指教!
  • slf4j 应该进行 static 初始化,这意味着您的原始问题仍然存在:您的类路径中有两个 slf4j 绑定。您的 hack 可能只会推迟 slf4j 类的加载。这只是意味着在加载 Velocity 之前没有使用 slf4j - Velocity 对 slf4j 的使用完全是标准的。
【解决方案2】:

这是关于重复 slf4j jar 的警告,请参阅explanation

当类路径上有多个绑定可用时,选择一个且只有一个您希望使用的绑定,然后删除其他绑定。例如,如果您在类路径上有 slf4j-simple-1.8.0-alpha2.jar 和 slf4j-nop-1.8.0-alpha2.jar 并且您希望使用 nop(无操作)绑定,则删除slf4j-simple-1.8.0-alpha2.jar 来自类路径。

【讨论】:

  • 感谢您的建议。不幸的是,我已经读过这样的书了。问题是我没有完全管理类路径。第三方贡献隐含地促成了它......我正在开发一个 Eclipse RCP 应用程序。我需要的第三方插件可能已经确定了他们自己的日志记录问题。我不能打破它们……我的期望是尽我所能。我正在管理 Velocity 引擎实例化,所以我希望完全控制它能够应用我想要的记录器...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
相关资源
最近更新 更多