提问人:tarun singh 提问时间:10/25/2023 最后编辑:fforfabiotarun singh 更新时间:10/26/2023 访问量:74
如何知道Spring Boot应用程序运行由于硬错误而停止或刚刚正常完成
How to know spring boot application run stopped due to hard error or it just completed normally
问:
我有一个要求,例如,如果 Spring Boot 应用程序因错误而突然停止,我需要在 splunk 中发送警报。如果它正常停止,我有一个日志应用程序,因此根据日志,我在 splunk 中配置警报消息。
例:
@SpringBootApplication
public class SpringBootHelloWorldExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootHelloWorldExampleApplication.class, args);
log.debug("successfully completed");
}
}
只有当应用程序正常停止时,我才会收到上面的日志。我的意思是成功完成申请。但是,如果我在应用程序中遇到任何错误,我将不会获得该日志。如果我得到这个日志,那么我正在发送 splunk 警报。
由于如果发生任何错误,我不会获得日志,那么我如何知道应用程序是否因硬错误而停止?或者我怎样才能记录一些硬错误?
答:
一种简单的方法是使用块来尝试运行 Spring Boot 应用程序。如果操作成功,它将继续记录 。否则,如果在执行过程中抛出异常,它将被 catch 块捕获,然后它将继续记录您偏好的合适消息,或者您可以将其与异常消息组合在一起。像这样的东西:try { } catch { }
"successfully completed"
@SpringBootApplication
public class SpringBootHelloWorldExampleApplication {
public static void main(String[] args) {
try {
SpringApplication.run(SpringBootHelloWorldExampleApplication.class, args);
log.debug("Successfully completed");
} catch (Exception e) {
log.debug("Error thrown: " + e.getMessage());
} //e.getMessage(): print the message of the Exception thrown
}
}
评论
它可以在 Java 级别上实现,使用类似 Runtime#addShutdownHook() 的东西。运行时将在 VM 终止上生成一个新线程来执行一些清理操作。在这个线程中,你可以做任何你需要的事情。
但是,我鼓励您在这里研究非 Java 方法。通常,在大型系统中,这种可观察性是通过外部系统实现的。这在很大程度上取决于您的 Java 应用程序的部署位置、启动方式等。
例如,如果您只是通过脚本启动它,则可以检查 Java 进程的退出代码。如果您部署在 K8S 集群中,无论是在本地还是在云端的某个地方,那么它就会有点困难,尽管 K8S 能够向 API 客户端提供失败进程的状态代码。
评论
配置日志记录:Spring Boot 使用 Spring Framework 的内置日志记录支持。您需要配置日志记录框架,以将错误记录到文件或特定日志追加器中。最常用的日志记录框架是 Logback 或 Log4j。在这里,我们将使用 Logback 作为示例。
在 Spring Boot 项目中,您可以添加 logback-spring.xml 或 logback.xml 配置文件来控制日志输出。例如:
<configuration>
<appender name="splunk" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>splunk-server-ip</syslogHost>
<port>514</port>
<facility>LOCAL0</facility>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date %level [%thread] </pattern>
</layout>
</appender>
<logger name="org.springframework" level="ERROR"/>
<root level="INFO">
<appender-ref ref="splunk"/>
</root>
</configuration>
此配置将 ERROR 级别的日志从 Spring Framework 发送到 Syslog Appender,后者可以配置为将日志发送到 Splunk 。
配置 Splunk:将 Splunk 实例配置为从您在 Logback 配置中指定的源接收日志。您需要在 Splunk 中设置数据输入才能接收 syslog 消息。
启动 Spring Boot 应用程序:启动 Spring Boot 应用程序。应用程序中记录在 ERROR 级别的任何错误都将根据您的 Logback 配置转发到 Splunk。
确保将 splunk-server-ip 替换为 Splunk 服务器的实际 IP 或主机名。
Springboot代码:
@SpringBootApplication
public class SpringBootTestApplication {
public static void main(String[] args) {
try {
SpringApplication.run(SpringBootTestApplication.class, args);
log.debug("Successfully completed");
} catch (Exception e) {
**log.error("Error thrown: " + e.getMessage());**
}
}
}
评论