如何知道Spring Boot应用程序运行由于硬错误而停止或刚刚正常完成

How to know spring boot application run stopped due to hard error or it just completed normally

提问人:tarun singh 提问时间:10/25/2023 最后编辑:fforfabiotarun singh 更新时间:10/26/2023 访问量:74

问:

我有一个要求,例如,如果 Spring Boot 应用程序因错误而突然停止,我需要在 splunk 中发送警报。如果它正常停止,我有一个日志应用程序,因此根据日志,我在 splunk 中配置警报消息。

例:

@SpringBootApplication  
public class SpringBootHelloWorldExampleApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(SpringBootHelloWorldExampleApplication.class, args);  
        log.debug("successfully completed");
    }  
} 

只有当应用程序正常停止时,我才会收到上面的日志。我的意思是成功完成申请。但是,如果我在应用程序中遇到任何错误,我将不会获得该日志。如果我得到这个日志,那么我正在发送 splunk 警报。

由于如果发生任何错误,我不会获得日志,那么我如何知道应用程序是否因硬错误而停止?或者我怎样才能记录一些硬错误?

Java spring-boot splunk 终止

评论


答:

0赞 Vaggos B 10/25/2023 #1

一种简单的方法是使用块来尝试运行 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 
        }
     }

评论

0赞 Mikhail2048 10/25/2023
此方法只是引导上下文创建。如果 VM 从外部关闭,则不会在此处捕获任何内容。
0赞 Vaggos B 10/25/2023
公平点。我从来没有考虑过超出 Java 级别的问题。知道这一点非常有趣,感谢您的反馈。
0赞 Mikhail2048 10/25/2023
没问题,您可以查看我的答案,看看如何在 JVM 级别或外部:)处理此问题
0赞 Mikhail2048 10/25/2023 #2

它可以在 Java 级别上实现,使用类似 Runtime#addShutdownHook() 的东西。运行时将在 VM 终止上生成一个新线程来执行一些清理操作。在这个线程中,你可以做任何你需要的事情。

但是,我鼓励您在这里研究非 Java 方法。通常,在大型系统中,这种可观察性是通过外部系统实现的。这在很大程度上取决于您的 Java 应用程序的部署位置、启动方式等。

例如,如果您只是通过脚本启动它,则可以检查 Java 进程的退出代码。如果您部署在 K8S 集群中,无论是在本地还是在云端的某个地方,那么它就会有点困难,尽管 K8S 能够向 API 客户端提供失败进程的状态代码。

评论

0赞 tarun singh 10/25/2023
我们的spring boot应用程序在AWS中运行,基于s3存储桶事件,我们正在触发此应用程序,您能否建议在这种情况下我需要遵循哪种方法来了解硬错误
0赞 tarun singh 10/25/2023
嗨,米哈伊尔,我有一个疑问,如果我们使用 shutdownhook,它会要求正常终止,对于任何硬错误,它也会被调用,但是我将如何区分正常终止或关机钩子中的硬错误终止
2赞 bvyas 10/26/2023 #3

配置日志记录: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());**
            } 
        }
     }

评论

0赞 tarun singh 10/26/2023
嗨,bvyas,你完全误解了我的问题,如果你在运行时出现任何内存不足错误,它甚至没有正确地捕获块,那么那里就没有log.error点。我的要求是,如果我在运行时遇到错误而不是异常,那么我需要记录一些东西,以便我在 splunk 中使用该日志。