Springboot启动报错时实现异常定位

当Springboot项目启动时,我们经常会遇到各种报错。如果不好好处理这些错误,会导致项目无法正常启动,严重影响开发效率。本文将介绍如何对于Springboot启动报错时,实现异常定位的方法。

1. 查看控制台日志

当Springboot项目启动发生错误时,应该首先查看控制台日志。控制台日志中记录了Springboot项目所有的启动过程信息,包括启动的顺序、加载的bean、启动的缓存等等。掌握控制台日志的读取能力,能够帮助我们快速定位异常所在的位置。

下面是一个控制台日志示例:

2021-08-10 08:12:31.968  INFO 45604 --- [           main] c.i.s.test.SpringbootTestApplication    : Starting SpringbootTestApplication v0.0.1-SNAPSHOT on LAPTOP-PDT9I5T4 with PID 45604 (/Users/Jack/Documents/SpringbootTest/target/classes started by Jack in /Users/Jack/Documents/SpringbootTest)
2021-08-10 08:12:31.970  INFO 45604 --- [           main] c.i.s.test.SpringbootTestApplication    : No active profile set, falling back to default profiles: default
2021-08-10 08:12:32.325  INFO 45604 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFERRED mode.
2021-08-10 08:12:32.389  INFO 45604 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 50 ms. Found 1 JPA repository interfaces.
2021-08-10 08:12:32.758  INFO 45604 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-08-10 08:12:32.847  INFO 45604 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.32.Final

上面的控制台日志中包含了SpringbootTestApplication项目的启动过程,我们可以通过日志中的信息进行排查错误原因。

2. 调整日志级别

当发现控制台日志无法给出足够的提示信息时,我们可以尝试调整日志级别。通过调整日志级别,我们可以只打印出我们关心的信息,从而更好的定位到异常。

在Springboot项目中,我们可以通过配置yml文件来调整日志级别。具体的配置方式如下:

logging:
  level:
    org.springframework.web: ERROR
    com.example: DEBUG

上面的配置中,我们为Spring框架设置了ERROR级别,只打印出错误信息;同时为我们自己的com.example包设置了DEBUG级别,能够打印出调试信息,方便我们进行异常定位。

示例说明

下面提供两个示例,说明如何通过控制台日志和日志级别调整来定位Springboot异常。

示例1:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }

}

当我们启动上面的Springboot项目时,控制台会输出如下的错误:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-08-10 08:33:04.019 ERROR 49558 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:806) ~[spring-boot-2.5.3.jar:2.5.3]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:797) ~[spring-boot-2.5.3.jar:2.5.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-2.5.3.jar:2.5.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.3.jar:2.5.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.3.jar:2.5.3]
    at com.example.demo.DemoApplication.main(DemoApplication.java:10) ~[classes/:na]
Caused by: java.lang.NullPointerException: null
    at com.example.demo.DemoApplication.run(DemoApplication.java:21) ~[classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:803) ~[spring-boot-2.5.3.jar:2.5.3]
    ... 4 common frames omitted

从上面的日志中我们可以发现,应用在执行CommandLineRunner的时候发生了异常。跟踪日志发现,空指针异常发生在com.example.demo.DemoApplication.run方法的第21行,这帮助我们定位到了异常。

销毁示例中的代码我们会发现,原来异常的发生是因为没有注入一个依赖,代码如下:

@Component
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private TestService testService;

    @Override
    public void run(String... args) throws Exception {
        testService.doSomething();
    }
}

当我们注入这个依赖后,异常得到了解决。

示例2:

在这个例子中,我们创建了一个ServletInitializer来配置servlet容器,同时为了方便起见,我们将日志打印级别调整为DEBUG。

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringbootTestApplication.class);
    }

    static {
        System.setProperty("logging.level.root", "DEBUG");
    }

}

当我们启动这个项目时,控制台日志输出大量的DEBUG级别的信息,能够帮助我们快速定位到问题。下面是一个示例的日志内容:

2021-08-10 09:03:19.040  INFO 50235 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-08-10 09:03:19.114 DEBUG 50235 --- [           main] o.s.w.s.h.BeanNameUrlHandlerMapping     : Rejected bean name 'controller' (for URL pattern '/test.txt') behind existing handler of type [class org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]
2021-08-10 09:03:19.175 DEBUG 50235 --- [           main] RequestMappingHandlerAdapter            : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@2103824d: startup date

通过上面的日志,我们可以看到有一个Rejected bean name 'controller' (for URL pattern '/test.txt')的错误输出,可以为我们提供更多的信息。

综上所述,查看/调整日志级别是非常重要的定位Springboot异常的方法之一,建议开发人员在开发阶段掌握好这个技能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot启动报错时实现异常定位 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • linux环境中常用的mysql命令介绍

    下面是“linux环境中常用的mysql命令介绍”的完整攻略: 1. 登录Mysql 在Linux中,可以通过以下命令登录到Mysql: mysql -h hostname -P port -u username -p hostname:Mysql服务器的主机名或IP地址; port:Mysql服务器的端口号,默认为3306; username:登录Mysq…

    database 2023年5月22日
    00
  • SQL计算timestamp的差值的方法

    计算timestamp的差值的方法主要是通过日期函数DATEDIFF()来实现。 在SQL Server中,DATEDIFF()函数的语法为: DATEDIFF(interval, date1, date2) 其中: interval:表示要计算的时间间隔,可以是年、月、周、日、时、分、秒等等。 date1和date2:要计算的两个日期。 使用该函数,可以计…

    database 2023年5月22日
    00
  • Redis配置外网可访问(redis远程连接不上)的方法

    Redis是一个开源的、高性能的非关系型内存数据库,其主要功能是提供快速的数据访问。 但是,在默认情况下,Redis只允许本地访问,如果需要对外提供服务,则需要进行相关配置。以下是Redis配置外网可访问的方法: 配置文件修改 Redis的配置文件是redis.conf,可以通过修改该文件来开启外网访问功能。 打开redis.conf,找到bind这一行,检…

    database 2023年5月22日
    00
  • 50个常用sql语句 网上流行的学生选课表的例子

    对于50个常用SQL语句,我们可以分为以下几个部分进行讲解: 一、查询语句 查询所有数据 SELECT * FROM table_name; 查询指定列的数据 SELECT column1, column2, … FROM table_name; 举个例子,比如我们有一个学生表(students),其中包含学生姓名(name)、年龄(age)和性别(ge…

    database 2023年5月21日
    00
  • centos下root运行Elasticsearch异常问题解决

    下面我将详细讲解如何解决centos下root运行Elasticsearch异常问题。 问题描述 在CentOS系统下以root账户运行Elasticsearch时,可能会遇到异常问题。 问题解决 解决此问题的方法如下: 1. 不要以root账户运行Elasticsearch 在CentOS系统下,不建议直接以root账户运行Elasticsearch。可以…

    database 2023年5月21日
    00
  • SQL数据查询之DQL语言介绍

    我会为您详细讲解“SQL数据查询之DQL语言介绍”的完整攻略。 DQL语言介绍 什么是DQL语言 DQL(Data Query Language)是数据库查询语言,主要用于从数据库中查询、检索和过滤数据。DQL语言包含了很多常用的关键字例如SELECT、FROM、WHERE、GROUP BY、HAVING等,可以通过这些关键字组合出各种复杂的数据查询语句。 …

    database 2023年5月21日
    00
  • SQL如何获取目标时间点或日期的方法实例

    当我们需要从一个存储了时间数据的数据表中获取指定时间点或日期的相关数据时,可以使用SQL语句中的时间函数和运算符来实现。 一、获取目标时间点的方法 1.使用NOW()函数来获取当前时间,然后结合运算符进行筛选,例如: SELECT * FROM table_name WHERE time_column = NOW(); 其中,table_name是需要查询的…

    database 2023年5月21日
    00
  • 如何使用Python从数据库中导出数据到CSV文件?

    以下是如何使用Python从数据库中导出数据到CSV文件的完整使用攻略,包括连接数据库、查询数据、将数据写入CSV文件等步骤。同时,提供两个示例以便更好理解如何使用Python从数据库中导出数据到CSV文件。 步骤1:连接数据库 在Python中,我们可以使用pymysql模块连接到MySQL数据库。以下是连接MySQL数据库的基本语法: import py…

    python 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部