从日志中排除异常

时间:2014-06-22 11:27:55

标签: java spring aspectj spring-aop

如何排除特定异常被记录在aspectj?

我们正在使用spring安全性,因此我们已经实现了UserDetailsS​​ervice。 当用户输入不存在的用户名时,Spring会抛出org.springframework.security.core.userdetails.UsernameNotFoundException。 我们希望从日志中排除该特定异常,但不是从它抛出的类(UserDetailsS​​ervice的实现)。

例如,在以下日志中,我们只需要第一行(输入... UserDetailsS​​erviceImpl)而不是后面的错误。

22 Jun 2014 14:20:35  INFO LoggingAspect - Entering: ...UserDetailsServiceImpl  Method name: loadUserByUsername Method arguments : [***]
22 Jun 2014 14:20:42 ERROR LoggingAspect - Unhandled exception caught: ...service.UserDetailsServiceImpl    loadUserByUsername
org.springframework.security.core.userdetails.UsernameNotFoundException: User with loginName: *** doesnt exist
at ...UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:30)
...

春天AOP有没有办法做到这一点?

编辑: 这就是我们在LoggingAspect中所拥有的:

@AfterThrowing(pointcut = "execution(* ..*.*(..)) && !methodsExcludedFromLog()", throwing = "exp")
public void afterThrowing(JoinPoint joinPoint, Throwable exp) {
...
}

我这需要以某种方式更改throwing以排除弹簧异常,但我不知道该怎么做。

编辑2: 因此,正如评论中所建议的那样,我尝试在log4j中添加一个过滤器,但它似乎不起作用,并且异常不会被过滤掉。谁知道问题可能是什么?

<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss} %5p %c{1} - %m%n" />
    </layout>
</appender>

<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
    <param name="append" value="false" />
    <param name="file" value="${catalina.home}/logs/MYAPP.log" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n" />
    </layout>
    <filter class="org.apache.log4j.filter.ExpressionFilter">
        <param name="expression" value="EXCEPTION ~= org.springframework.security.core.userdetails.UsernameNotFoundException" />
        <param name="acceptOnMatch" value="false"/>
    </filter>

</appender>

<root>
    <level value="INFO" />
    <appender-ref ref="consoleAppender" />
    <appender-ref ref="fileAppender" />
</root>

感谢。

1 个答案:

答案 0 :(得分:0)

如评论中所述,您只能使用

{
    if (e instanceof UsernameNotFoundException)
        return;
    // Log exception
}

在你的建议开始时。 AspectJ或Spring AOP中没有语法方式以某种方式在“投掷”部分中使用jokers或boolean表达式。在那里,您只能通过将抛出的异常绑定到类型变量来捕获所有异常或隐式地​​将选择范围缩小到一个特定类型(及其子类型)。如果你考虑一下,你应该如何将一个对象绑定到一个具有多种类型的变量?

无论你喜欢与否,这都是正确的答案。我现在无法为您更改AspectJ语法和语义。 : - )