如何让404页面不写错误日志?

时间:2012-06-21 09:53:03

标签: playframework playframework-1.x

在我们的理念中,错误日志总是由程序员错误引起。

在Play 1.2.x,prod模式下,对不存在页面的任何访问都会触发错误日志:

ERROR (play) ~ 
MyController.myAction action not found
Action not found
Action MyController.myAction could not be found. Error raised is No method public static void myAction() was found in class controllers.MyController
play.exceptions.ActionNotFoundException: Action MyController.myAction not found
    at play.mvc.ActionInvoker.getActionMethod(ActionInvoker.java:604)
    at play.mvc.ActionInvoker.resolve(ActionInvoker.java:85)
    at Invocation.HTTP Request(Play!)
Caused by: java.lang.Exception: No method public static void myAction() was found in class controllers.MyController

在这种情况下,如何配置Play不发出错误日志?最多可能是WARN日志级别?

2 个答案:

答案 0 :(得分:6)

记录它的代码位于ActionInvoker.java(播放1.2.5RC4):

catch (ActionNotFoundException e) {
            Logger.error(e, "%s action not found", e.getAction());
            throw new NotFound(String.format("%s action not found", e.getAction()));
        }

所以似乎没有办法调整ActionNotFoundException的日志记录级别。我同意这不应该是'错误'级别。我建议在https://play.lighthouseapp.com/dashboard打开一张票。

答案 1 :(得分:0)

虽然不是最优雅的解决方案,但您可以使用Apache log4j Extras包中的ExpressionFilter类从默认错误日志中过滤掉这些异常,并进行以下更改:

<强> dependencies.yml

- log4j -> apache-log4j-extras 1.2.17:
    transitive: false

<强>&LT;记录&GT;的.conf

log4j.appender.<appender>.filter.1=org.apache.log4j.filter.ExpressionFilter
log4j.appender.<appender>.filter.1.expression=EXCEPTION ~= play.exceptions.ActionNotFoundException
log4j.appender.<appender>.filter.1.acceptOnMatch=false

这也允许您通过创建新的log4j appender并将上述规则中的acceptOnMatch属性反转为仅接受ActionNotFound异常的日志记录,将这些特定消息重定向到单独的目标。