【问题标题】:Velocity upgrade from 1.7 to 2.0速度从 1.7 升级到 2.0
【发布时间】:2021-01-11 19:45:20
【问题描述】:

我正在尝试从使用 LogChute 接口的速度 1.7 迁移。在我当前的实现中,我使用 log 方法来获取速度日志级别并比较我们自己的日志级别。请看下面的代码。

@Override
public void log(int level, String message) {
    LogLevel projLevel = null;
    switch ( level )
    {
       case LogChute.DEBUG_ID:
          projLevel = LogLevel.DEBUG ;
          break ;

       case LogChute.INFO_ID:
          projLevel = LogLevel.INFO ;
          break ;

       case LogChute.WARN_ID:
          projLevel = LogLevel.WARNING ;
          break ;

       case LogChute.ERROR_ID:
          projLevel = LogLevel.ERROR ;
          break ;

       default:
          projLevel = LogLevel.ERROR ;
          break ;
    }

    if (Log.canLog(projLevel, Const.VELOCITY_LOGGER))
    {
       Log.log(projLevel, Const.VELOCITY_LOGGER, getClass(), message,
          null);
    }

}

根据 apache velocity 2.0 文档,不推荐使用 LogChute,并且 apache velocity 正在使用 SLF4J 进行日志记录。因此,我尝试将 SLF4j-API 和 SLF4J 绑定用作 SLF4J Simple Logger 和 WebApp SLF4J Logger,但无法使用该类,因为我需要将速度日志级别与我们的自定义日志级别进行比较。所有这些都需要在运行时发生。

对于当前速度配置,我遵循以下配置,这与基于 1.7 速度配置作为 services.VelocityService.runtime.log.logsystem.class=our.package.xclassName 调用的自定义类相同。

这是文档链接(https://velocity.apache.org/engine/1.7/developer-guide.html#configuring-logging)

这些都在 2.0 版本中被移除了。

有人可以帮我解决这个问题吗?我正在尝试升级速度。

【问题讨论】:

  • 如果您能澄清您的问题(第 2 段和第 3 段)并清楚地表明问题所在,这将使我们更容易帮助确定问题并解决您的问题 :)跨度>
  • 嘿@dantechguy,我的问题是apachevelocity的版本升级,以前我使用的是1.7版本的LogChute接口,我已经实现并编写了上面的代码,在这个的帮助下我能够获得速度级别的日志。因此,我正在尝试使用该文档提到的 2.0 速度版本来使用 SLF4J 和绑定。所以,我正在尝试使用 Simple Logger,但这个类是一个单例,无法扩展和利用这个对象。所以,我需要一个类似的代码来运行它。第三段是 1.7 版本中获取此类的配置

标签: java slf4j velocity apache-velocity slf4j-api


【解决方案1】:

基本上,您希望能够动态设置日志级别。也许您应该将 slf4j 绑定从 slf4j-api 更改为 logback,请参阅 this question

如果你想坚持 slf4j-simple,也许你可以尝试给 Velocity 一个自定义的 slf4j 记录器实例(未测试):

public class MyCustomLogger extends org.slf4j.SimpleLogger
{
    public MyCustomLogegr(String name) { super(name); }

    protected boolean isLevelEnabled(int logLevel)
    {
        LogLevel projLevel = null;
        switch ( level )
        {
           case LogChute.DEBUG_ID:
              projLevel = LogLevel.DEBUG ;
              break ;
           case LogChute.INFO_ID:
              projLevel = LogLevel.INFO ;
              break ;
           case LogChute.WARN_ID:
              projLevel = LogLevel.WARNING ;
              break ;
           case LogChute.ERROR_ID:
              projLevel = LogLevel.ERROR ;
              break ;
           default:
              projLevel = LogLevel.ERROR ;
              break ;
        }
        return Log.canLog(projLevel, Const.VELOCITY_LOGGER);
    }
}

然后,您必须将此记录器交给 Velocity:

VelocityEngine velocity = new VelocityEngine();
// ... other configurations
velocity.setProperty("runtime.log.instance", new MyCustomLogger());
velocity.initialize();

【讨论】:

  • 感谢您提供信息。@Claude Brisson 但问题是 org.slf4j.impl.SimpleLogger 构造函数没有修饰符,并且在 slf4j-simple 包之外无法访问该对象。我也尝试过 WebApp SLF4J Logger,这个绑定也是一个单例,并且在包外无法访问该对象。
  • 分叉 slf4j-simple 或 webapp-slf4j-logger 以拥有公共构造函数怎么样?
  • 我将通过联系我们的团队来确认这一点。我尝试使用 SimpleLoggerFactory 并获取 SimpleLogger 的实例,但无法获取方法 isLevelEnabled。
  • 无论如何,slf4j 的整体理念是拥有静态记录器。您应该与您的团队确认保持这种运行时行为的相关性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
相关资源
最近更新 更多