Spring - slf4J:如何自动记录错误和异常?

Amr*_*sal 5 java spring hibernate aspectj slf4j

我们正在使用Spring和slf4j以及hibernate,我正试图找出一种自动记录异常和错误的方法(即不在每个类中启动调试器的实例),这样它就可以捕获任何抛出的错误或异常.在日志中获取类和方法名称,

我读了一篇关于使用方面和拦截器的简短说明,所以你能否为我提供一些实现这个的详细方法,

问候,

sfu*_*ger 10

异常方面可能如下所示:

@Aspect
public class ExceptionAspect {

  private static final Logger log = LoggerFactory.getLogger(ExceptionAspect.class);

  public Object handle(ProceedingJoinPoint pjp) throws Throwable {
     try {
       return pjp.proceed();
     } catch (Throwable t) {
       // so something with t: log, wrap, return default, ...
       log.warn("invocation of " + pjp.getSignature().toLongString() + " failed", t);
       // I hate logging and re-raising, but let's do it for the sake of this example
       throw t;
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

春天conf:

<!-- log exceptions for any method call to any object in a package called 'svc' -->
<bean class="org.example.aspects.ExceptionAspect" name="exceptionAspect" />
<aop:config>
  <aop:aspect ref="exceptionAspect">
    <aop:around method="handle" pointcut="execution(* org.example..svc..*.*(..))" />
  </aop:aspect>
</aop:config>
Run Code Online (Sandbox Code Playgroud)

编辑:

如果你想让记录器代表被包装的bean登录,你当然可以这样做:

LoggerFactory.getLogger(pjp.getTarget().getClass()).warn("damn!");
Run Code Online (Sandbox Code Playgroud)

或者如果您优先使用此方法的声明类而不是实际(可能代理/自动生成的类型):

LoggerFactory.getLogger(pjp.getSignature().getDeclaringType()).warn("damn!");
Run Code Online (Sandbox Code Playgroud)

老实说,我无法估计每次调用LoggerFactory.getLogger(..)的性能影响.我认为它不应该太糟糕,因为异常是特殊的(即罕见的).