我有两项服务-服务1
和服务2
<代码>服务1通过SpringREST模板调用一些服务2
API。现在服务2中发生了一些异常。我需要它在
服务1
中的整个堆栈跟踪。如何得到它?
Service 1 ---calls--> Service 2
Spring是否将堆栈跟踪传递到
服务1
?
你可以说我是这样打电话的:
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<String> entity = new HttpEntity<String>(headers);
return restTemplate.exchange("http://localhost:8080/products", HttpMethod.GET, entity, String.class).getBody();
1) 在异常之前捕获特定的HttpServerErrorException和HttpClientErrorException,将异常对象一直传播到服务1或资源。
try {
//code
} catch (HttpServerErrorException | HttpClientErrorException ex) {
throw new SystemException("Http Exception", ex.getResponseBodyAsString(),
ex);
} catch (RuntimeException ex) {
throw new SystemException("RuntimeException", ex);
} catch (Exception ex) {
throw new SystemException("default exception block", ex);
}
2) 为您的系统和业务异常提供下面这样的异常映射器,可以捕获并记录所有错误消息。
public class SystemException extends Throwable implements
ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable ex) {
//code to handle exception
}
总结一下一个简单的方法,它只不过是将Spring Boot的Zipkin
和Sleuth
启动程序添加到您的pom.xml
中,以实现多个应用程序之间的双向日志跟踪...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth</artifactId>
<version>${spring-cloud-sleuth.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
</dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
…并在应用程序中配置日志模式。属性
以反映侦探在您的请求中注入的SpanId
s和TraceId
s…
logging.pattern.level=[%X{X-B3-TraceId}/%X{X-B3-SpanId}] %-5p [%t] %C{2} - %m%n
您还可以将自己的进度与Openzipkin的Github帐户上运行的示例进行比较。
也许你可以试一试,向我们展示你的经历和进步!
我需要它在服务1中的整个堆栈跟踪。如何得到它?
所以有很多方法可以实现,本质上你必须实现。您可以从service2
获取JSON响应中的相关异常消息/跟踪。也就是说,当
服务2
结束时出现任何异常
时,我们可以配置响应以发送相关异常信息。
在这篇文章中,有3个答案解释了不同的实现方法,还有这个。现在开始:
堆栈跟踪是否通过Spring传递到服务1?
通常,在处理
web请求时引发的任何未处理/运行时
异常
都会导致服务器返回HTTP 500
响应。
因此,答案是spring不会将堆栈跟踪传输到
服务1
,而是以错误HTTP500
和最有可能的异常消息作为响应。
但是,您自己编写的任何异常都可以用
@响应状态
注释来注释(它支持由HTTP
规范定义的所有HTTP状态代码)。
当一个
带注释的异常
从控制器方法抛出,并且没有在其他地方处理时,它将自动导致相应的HTTP响应
返回指定的state-code并写入消息/跟踪。例如,
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Account") // 404
public class AddressNotFoundException extends RuntimeException {
// ...
}
下面是一个使用它的控制器方法:
@RequestMapping(value="/account/{id}", method=GET)
public String showOrder(@PathVariable("id") long id, Model model) {
Account account = accountServices.findAccountById(id);
if (account == null) throw new AddressNotFoundException(id);
model.addAttribute(account);
return "accountDetail";
}
如果此方法处理的URL包含未知帐户ID,则将返回熟悉的
HTTP 404
响应。
希望这有帮助。
问题内容: 最近,我问是否要报告捕获到的异常的文本。出乎意料的是,大多数答案都误解了我的问题,并以为我在问是否要报告堆栈跟踪以获取捕获的异常,这表明这样做是正常的。所以我要问一个后续问题。 在例外情况下,应该或不应该在什么情况下报告堆栈跟踪?通过“报告”,我包括要求一个日志记录框架为您记录堆栈跟踪 我不问是否报告 的东西 。我在问那个报告是否应该包括堆栈跟踪。 问题答案: 它取决于上下文。例如,当
问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。
问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此
现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?
在我们的日志文件中,我们发现以下内容: 只有这一行,没有异常堆栈跟踪。 出现此异常的try块正在执行使用javassist创建的动态生成的Java字节码。 我想知道两件事: : null 丢失的堆栈跟踪,尽管在块内使用调用日志挂钩,这通常会导致完整的堆栈跟踪被打印在日志文件中。 我的问题: > 什么样的代码会导致日志输出“java.lang.ArrayIndexOutOfBoundsExcepti
问题内容: Java的e.printStackTrace()不会打印内部异常的堆栈跟踪的所有详细信息。 有没有现成的方法来生成字符串形式的完整堆栈跟踪?(除了自己格式化外) 编辑 我刚刚发现printStackTrace()的作用-显然,它过滤掉的堆栈帧正是内部异常和外部异常共同的帧。因此,实际上这是我想要的,而不是“完整”堆栈跟踪。 问题答案: 我最终滚动了自己的代码(我采用了Throwable