问题描述
我正在尝试从使用 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 速度 2.0 文档,不推荐使用 LogChute,而 apache 速度使用 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 版本中删除了。
解决方法
基本上,您希望能够动态设置日志级别。也许您应该将 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();