当前位置: 首页 > 知识库问答 >
问题:

Java微服务中的日志记录和异常处理

琴镜
2023-03-14

我正在开发一个微服务,它基于存储在自己数据存储中的某些配置进行一些计算。计算API通过REST API存储。该应用程序是一个Spring启动应用程序。现在该应用程序主要有3层:

  1. Rest控制器

我计划使用以下几点来处理日志记录和异常处理:

>

如果在DAO层或服务层中有任何已检查的异常,则记录它们并抛出从RuntimeException派生的自定义异常。

有几个自定义异常,当我们遇到无效值、空值等情况时,应该从服务层抛出这些异常。

在REST控制器中有一个try-catch块,记录异常,即消息和stacktrace,并相应地返回响应。

所以总体思路是让RuntimeException一路传播到REST控制器,在那里记录它们,并相应地发送响应。在检查异常的情况下,用相同的方法记录它们,并抛出自定义异常。

请建议在这些应用程序中记录异常的正确或良好方法

共有2个答案

傅自明
2023-03-14

只选择一个地方记录异常。

在您的设计中,如果DAO中发生异常,它将:

  • 登录DAO
  • 然后触发运行时异常,该异常将被捕获并登录到控制器中
  • 然后通过REST返回非2xx响应状态,这将触发根据您的第一个点记录响应

因此,要么在三个地方有相同的信息,要么在日志中的两个或三个地方有关于单个错误的不同信息位。

选择一个地方记录错误,并确保该地方存在所有相关信息(即,将基础DAO异常设置为运行时异常的原因,不要忘记记录运行时异常及其原因)。

张亦
2023-03-14

编写控制器建议,以捕获所有异常

*/
/**
 * Uncaught exception handler
 * @param e - Exception
 */
@ExceptionHandler(Exception.class)
@ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public void handleError(Exception e,HttpServletRequest request, HttpServletResponse response){
    logger.error("Exception occured : {}",e);
        //logs request & response here
}

另外,请检查这里描述的AbstractRecestLoggingFilter。

对于所有自定义应用程序特定的执行创建自己的自定义异常类型

 类似资料:
  • 在将big project移植到log4j2之后,我注意到异常日志不起作用。这样的代码

  • Java异常处理分为错误、已检查异常和未检查异常。这个问题是关于例外的。 正常的Java异常处理是扩展检查异常的异常类,并通过考虑异常层次结构来处理您需要的异常。 例如: 但是我看到了主要的Spring书籍,甚至在Spring boot中提到的Internet教程中,以及在微服务的上下文中,总是从RuntimeException类扩展而来,即使使用@ControllerAdvice。 这显然违反了

  • 问题内容: 下面的编码方法是好的做法吗? 而且,我应该 仅使用记录器? 只抛出异常? 两者都做吗? 我知道可以在调用堆栈的另一部分捕获异常,但是也许其他日志记录有一些隐藏的好处,并且也很有用。 问题答案: 在某些情况下,我会同时使用日志记录和引发异常。特别是,它在API中很有用。通过抛出异常,我们允许调用者对其进行处理,并通过记录日志,我们可以自行确定其根本原因。 而且,如果调用者在同一系统中,则

  • 但在我的代码中,我记录了大部分信息 用户名错误发生,计时,整个异常,错误,方法,行号,文件路径,服务网址,所有这些东西,但我仍然面临这个问题,请帮助我解决这个问题。我使用的是ASP.NET核心web API。

  • 我有一个SpringCloudGateway应用程序,它充当我的数据服务的网关。我的应用程序使用SSE在UI中推送通知。当我看到网关日志时,我的日志中充满了异常,如: 我有一个错误处理程序类: 但它仍在记录错误。如何使我的网关不写入日志。 我的pom文件是: 我的依赖关系树:

  • 1.【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory