beetl错误处理类
在使用beetl中如果${searchKey!}如果遗漏了"!"错误会在控制台输出、而没有记录到日志提醒中。一次线上环境出错没有及时拦截到错误记录被boss大吵、特此记录一下。经常出现的错误提醒是:>>04:18:20:变量未定义(VAR_NOT_DEFINED):searchKey1 位于6行 资源:/xxx/search.html
1.官网提供的说明及解决方案
参考官网网址:beetl官网说明 其实官网说的已经非常清晰和全面了只是我们需要把它记录到日志文件中方便报警、提醒。
2. 自定义类方便系统记录错误日志
类定义如下:
public class ReThrowConsoleErrorHandler extends ConsoleErrorHandler {
private static Logger LOG = LoggerFactory.getLogger(ReThrowConsoleErrorHandler.class);
@Override
public void processExcption(BeetlException ex, Writer writer) {
super.processExcption(ex, writer);//控制台输出
LOG.info("enter beetl 异常处理 开始 。。。。。。。。。");
ErrorInfo error = new ErrorInfo(ex);
StringBuilder sb = new StringBuilder(">>").append(this.getDateTime()).append(":");
sb.append(error.getType());
sb.append(":");
sb.append(error.getErrorTokenText());
sb.append("位于");
sb.append(error.getErrorTokenLine());
sb.append("行资源:");
sb.append(getResourceName(ex.resourceId));
sb.append("\n");
String content = null;
ResourceLoader resLoader = ex.gt.getResourceLoader();
try {
Resource res = resLoader.getResource(ex.resourceId);
int[] range = this.getRange(error.getErrorTokenLine());
content = res.getContent(range[0], range[1]);
if (content != null) {
String[] strs = content.split(ex.cr);
int lineNumber = range[0];
for (int i = 0; i < strs.length; i++) {
sb.append(lineNumber);
sb.append("|");
sb.append(strs[i]);
sb.append("\n");
lineNumber++;
}
}
} catch (IOException e) {
LOG.error("beetl ioException :", e);
}
LOG.error(sb.toString());
LOG.info("enter beetl 异常处理显示结束 。。。。。。。。。");
}
}
3. 修改 beetl.properties
默认的配置如下:
ERROR_HANDLER = org.beetl.core.ConsoleErrorHandler
修改后的配置如下:
ERROR_HANDLER = com.xxx.web.view.beetl.error.ReThrowConsoleErrorHandler
4. 重启服务测试是否生效
重启项目验证
5.注意事项
此处错误提醒已经返回到视图层如果想通过Spring MVC或者Struts2等拦截异常日志是拦截不到的。 比如spring mvc中使用:org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver类的子类是捕获不到异常信息的。而定义拦截器中可以获得如下图: 另外通过前台浏览器查看返回的html代码如下截图: