5

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

在 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日志级别?

4

2 回答 2

6

记录此问题的代码位于 ActionInvoker.java(play 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上开一张票。

于 2012-06-21T22:19:35.070 回答
0

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

依赖项.yml

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

<记录>.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 附加程序并反转acceptOnMatch上述规则中的属性以仅接受ActionNotFound异常日志记录,将这些特定消息重定向到单独的目标。

于 2014-04-18T22:37:24.907 回答