springboot 最简单的日志打印,输出日志文件 及全局异常捕获处理

本文介绍如何在SpringBoot项目中使用日志并配置全局异常捕获,通过实例演示了如何利用日志记录和异常类型处理提升运维效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直使用System.out.println()的我终于在今天从良了,我决定开始使用log了。

 

好了,不废话了,进入正题(先介绍日志简单使用,再介绍全局异常捕获及根据异常类型处理,不想看日志使用的直接看后面。)

前言:

我在学习这个日志打印的时候,在网上浏览了很多相关的知识,发现有些高级配置啊,有些花样日志管理啊等等;

而我,仅仅是想用一下日志的打印, 然后把日志生成某个文件给运维人员看(然后关掉Tomcat那可恶的日志)。 也就是仅此而已。

所以,接下来的日志使用,还真的是蛮轻巧(简单)的。

首先,

日志这边用到的jar包方法是:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

为什么不把pom直接贴出来呢,是因为:

看,

也就是说,还是贴pom.xml的东西出来吧:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

</dependencies>

 

spring-boot-starter这里面已经自带了我们这次日志需要使用的依赖了,所以我们不用导额外的了。

 

那么,依赖不用弄,那我们接下来弄啥?

简单为这个日志使用配置一下吧:

application.properties:

#将日志文件生成到系统盘路径

logging.path=F:\\logtest\\log


#简单设置一下日志等级
logging.level.web=info


#将日志文件生成到项目绝对路径
#logging.file=log\\myboot.log

 

里面的配置作用就不用解释了吧,你看我的注释,已经简单介绍了。

 

好了,开始使用。

新建一个controller:

我的叫TestSoGa,你随意。

package com.springbootstudy.controller;




import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;



@RestController
@RequestMapping("testYes")
public class TestSoGa {
   //记得加上这个哇,这是告诉全世界,你要开始在这类里面使用日志
 protected static final Logger logger = LoggerFactory.getLogger(TestSoGa.class);
    


    @RequestMapping("/testlog")
    public String helloworld() {
        logger.info("log开始生成");
        return "Hello world!";
    }


}

 

好了,运行,访问一下 @RequestMapping("/testlog"),(当然了,我前面还有一个@RequestMapping("/testYes")的,别因为这个而一直访问错误了。),访问后,OK日志打印处理了,然后日志文件也生成了(本地路径的去本地系统盘路径看,绝对路径的在项目看)。

好了,就这样,我们的日志使用已经介绍完了。  

接下来,结合这个日志打印,那么我们来配置全局异常捕获,这么一来,运维人员就舒服点了,去看日志,然后我们异常捕获给他做点日志处理,我们开发也不用被牵扯过去解释了。

首先, 建一个异常Handler吧,MyExceptionHandler.java。

然后紧接着,先放着吧,我们去上面的日志controller去弄点方法故意抛出点错误。

(里面方法举了2个例子。抛出了2个异常,自己看完后自己举一反三~)

package com.springbootstudy.controller;

import com.springbootstudy.pojo.TestUser;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;


@RestController
@RequestMapping("testYes")
public class TestSoGa {
    protected static final Logger logger = LoggerFactory.getLogger(TestSoGa.class);
    
    @RequestMapping("/errortest")
    public Integer ErrorTest(HttpSession session) {


        String thisMethodName = new Exception().getStackTrace()[0].getMethodName();// 获得当前的方法名
        String thisClassName = new Exception().getStackTrace()[0].getClassName();// 获得当前的方法名
        session.setAttribute("errorSource","方法名称->"+thisMethodName+"   |  "+"控制器名称->"+thisClassName);
        System.out.println("**********"+thisMethodName+"*************"+thisClassName);

        return 100 / 0;
    }

    @RequestMapping("/errortest2")
    public String ErrorTest2(HttpSession session) {
        String thisMethodName = new Exception().getStackTrace()[0].getMethodName();// 获得当前的方法名
        String thisClassName = new Exception().getStackTrace()[0].getClassName();// 获得当前的类名
        session.setAttribute("errorSource","方法名称->"+thisMethodName+"   |  "+"控制器名称->"+thisClassName);
        String tfk= session.getAttribute("testNULLSessionValue").toString();

        return tfk;
    }



    @RequestMapping("/testlog")
    public String helloworld() {
        logger.info("log开始生成");
        return "Hello world!";
    }


}

好了,配置完这个先不用管那么多,我们(MyExceptionHandler)直接继续再复制粘贴:

package com.springbootstudy.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@ControllerAdvice
public class MyExceptionHandler {
    private static Logger logger = LoggerFactory.getLogger(MyExceptionHandler.class);
    @ExceptionHandler(value = Exception.class)
    public void defaultExceptionHandler(HttpServletRequest req, HttpSession session,Exception e){
        String errorSource=  session.getAttribute("errorSource").toString();
        //根据抓获的异常类型,做逻辑处理,并打印日志信息
        if(e instanceof java.lang.NullPointerException){

            logger.info("空指针异常---"+"---出错的方法是:"+errorSource);
        }
        if(e instanceof java.lang.ArithmeticException){
            logger.info("使用0作为分母---"+"---出错的方法是:"+errorSource);
        }

        e.printStackTrace();
        System.out.println("全局异常捕获中");
    }


}

 

好了,以上全局异常捕获及简单的配合日志打印处理已经完毕了,我下面也介绍下这个全局异常捕获:

先是,controller里面的方法,我们代码走读吧,

就看这个方法吧,

@RequestMapping("/errortest2")
public String ErrorTest2(HttpSession session) {
    String thisMethodName = new Exception().getStackTrace()[0].getMethodName();// 获得当前的方法名
    String thisClassName = new Exception().getStackTrace()[0].getClassName();// 获得当前的类名
    session.setAttribute("errorSource","方法名称->"+thisMethodName+"   |  "+"控制器名称->"+thisClassName);
    String tfk= session.getAttribute("testNULLSessionValue").toString();

    return tfk;
}

这是个故意为了抛异常而弄的, 最后一行就是故意抛出个空指针异常咯,因为session值根本就没~

然后前面获取当前的方法名啊,类名啊 这些,大家都可以自己发挥,也就起到后面日志打印的时候,提供下异常源跟踪。

然后看异常Handler里面的方法:

 

String errorSource= session.getAttribute("errorSource").toString(); //根据抓获的异常类型,做逻辑处理,并打印日志信息 if(e instanceof java.lang.NullPointerException){ logger.info("空指针异常---"+"---出错的方法是:"+errorSource); }

 

就看这几行吧, 就是把之前那边的异常跟踪源信息放到session,从这边取出来, 然后就是小重点了:

e instanceof java.lang.NullPointerException  这个,就是用来判断当前捕获到的异常是什么类型,然后就可以添油加醋了。

 

上个结果图咯:

好了,简单的使用介绍完毕。

### Spring Boot 中 WebClient 的使用教程 #### 添加依赖项 为了在 Spring Boot 应用程序中启用 `WebClient` 功能,需确保项目配置文件中包含了必要的 Maven 或 Gradle 依赖。具体来说,应当加入 `spring-boot-starter-webflux` 这一启动器[^1]。 对于 Maven 用户而言,在 pom.xml 文件内添加如下片段即可: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> ``` 而对于采用 Gradle 构建系统的开发者,则应在 build.gradle 文件里声明相应的依赖关系: ```groovy implementation 'org.springframework.boot:spring-boot-starter-webflux' ``` #### 创建并初始化 WebClient 实例 一旦上述依赖被成功集成到工程之中,便可以通过多种方式创建 `WebClient.Builder` 来构建具体的客户端对象实例。最简单的方法就是利用 Spring 自动装配机制获取预设好的 builder 对象;另一种则是手动指定基础 URL 和其他选项来自定义化设置过程[^2]。 ```java @Autowired private WebClient webClient; // 或者通过构造函数注入的方式获得更灵活控制权 @Bean public WebClient webClient(WebClient.Builder builder){ return builder.baseUrl("http://example.com").build(); } ``` #### 发起 HTTP 请求 有了准备就绪的 `WebClient` 后就可以轻松发起各种类型的网络调用了。下面给出几个常见的操作示范代码段落,包括 GET/POST 方法及其参数传递形式[^4]。 ##### 执行简单的GET请求 ```java Mono<String> response = this.webClient.get() .uri("/api/resource") .retrieve() // 处理响应体流 .bodyToMono(String.class); // 将响应转换为目标类型 ``` ##### 提交表单数据至服务器端口 ```java MultiValueMap<String, String> formData = new LinkedMultiValueMap<>(); formData.add("key", "value"); Mono<Void> result = this.webClient.post() .uri("/submit/form") .contentType(MediaType.APPLICATION_FORM_URLENCODED) .body(BodyInserters.fromFormData(formData)) .exchange(); // 返回整个响应消息而非仅限于主体部分 ``` #### 常见问题解答 当遇到与 `WebClient` 相关的技术难题时,这里列举了一些可能碰到的情况及解决方案建议[^3]: - **Q:** 如何处理超时异常? A: 可以为每次请求单独设定最大等待时间限制,或者全局范围内调整默认值。例如修改 application.properties 文件中的属性 spring.webflux.client.http.connect-timeout=5s 即可生效。 - **Q:** 怎样捕获错误状态码? A: 使用 `.onStatus()` 函数可以在接收到非成功的HTTP状态码前插入自定义逻辑分支来进行特殊状况下的重定向或记录日志等动作。 - **Q:** 是否支持并发执行多个异步任务? A: 是的,得益于内部实现了反应式流规范的支持,因此能够很好地兼容多线程环境下的高效运作模式而不会造成资源浪费现象发生。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小目标青年

对你有帮助的话,谢谢你的打赏。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值