当前位置: 首页 > 面试题库 >

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

吴康平
2023-03-14
问题内容

我们将Spring与slf4j和hibernate结合使用,我试图找到一种自动记录异常和错误的方法(即,无需在每个类中启动调试器的实例),以便它可以捕获抛出的任何错误或异常,并且在日志中获取类和方法的名称,

我读了一篇关于为此使用方面和拦截器的简短说明,因此您能否为我提供一些实现此目的的详细方法,

问候,


问题答案:

异常方面可能看起来像这样:

@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;
     }
  }
}

spring会议:

<!-- 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>

编辑:

如果您希望记录器代表包装好的Bean登录,则可以这样做:

LoggerFactory.getLogger(pjp.getTarget().getClass()).warn("damn!");

或者,如果您更喜欢此方法的声明类,而不是实际的(可能是代理/自动生成的类型):

LoggerFactory.getLogger(pjp.getSignature().getDeclaringType()).warn("damn!");

老实说,我无法估计每次调用LoggerFactory.getLogger(..)会对性能产生的影响。我认为应该不会太糟,因为无论如何例外都是例外(即罕见)。



 类似资料:
  • 我有一个使用slf4j进行日志记录的应用程序。现在我想添加一个功能,每当我记录错误时,就会调用一个特定的url。目前,我在应用程序级别添加了一个包装器方法,该方法发送http请求,然后调用logger方法。但这样我就错过了一些输出,一些异常只是被记录下来,而没有发送相应的请求。我正在尝试创建我的自定义logger类。我的问题是应该扩展哪些类(或要实现的接口)。我无法扩展Logger类,因为它的构造

  • 问题内容: 我有一个要登录的Maven&Spring应用程序。我热衷于使用SLF4J。 我想将所有配置文件放入包含log4j.xml的目录{classpath} / config中,然后使用spring bean进行初始化。 例如 但是,我得到此警告,没有日志记录。 log4j:WARN找不到记录器的附加程序(org.springframework.context.support.ClassPat

  • 问题内容: 从java.util.logging的日志记录级别如何映射到SLF4J? SLF4J 跟踪 调试 信息 警告 错误 致命 java.util.logging 最好的 更好 精细 配置 信息 警告 严重 问题答案: 通过SLF4JBridgeHandler文档和测试:

  • 从java.util.logging到SLF4J的日志级别如何映射? SLF4J null java.util.Logging null

  • 问题内容: 我想检查特定背景文件中的错误,但是标准错误流由前台程序控制,并且问题中文件中的错误未显示。不过,我可以使用该模块并将输出写入文件。我想知道如何使用它来记录所有异常,错误及其回溯。 问题答案: 记录程序中引发的 任何 异常可能是一个坏主意,因为Python还将异常用于正常控制流。 因此,您应该只记录 未捕获的 异常。一旦有了异常对象,就可以使用记录器的方法轻松地执行此操作。 要处理所有未

  • 问题内容: 这是一个第三方应用程序,在我们的应用程序服务器上生成大量的登录信息。像这样: 如何关闭slf4j的输出?我已经在.war文件中查找了slf4j的一些配置,但没有找到任何配置。他们的网站也没有帮助 问题答案: slf4j只是实际日志后端(此处是覆盖jakarta commons日志记录)的一个漏斗,这是您必须配置的摆脱某种消息的程序。对于登录,这是适当的配置代码段: 对于log4j,它非