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

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

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


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


前言:


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


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


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


首先,


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

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


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


image.png


也就是说,还是贴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  这个,就是用来判断当前捕获到的异常是什么类型,然后就可以添油加醋了。


上个结果图咯:


image.png


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

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
6月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
192 2
|
XML Java Maven
springboot-多环境配置文件
本文介绍了如何创建开发和生产环境的配置文件,并在IDEA和Maven中进行配置。开发环境中,通过设置profile为`dev`来指定配置文件;生产环境中,使用Maven命令参数`-Pprod`打包并指定配置文件。公共配置可放在`application.yml`中统一管理。日志配置需确保`logback-spring.xml`中的profile正确,以保证日志正常输出。
1069 4
springboot-多环境配置文件
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2992 1
|
7月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1259 5
|
存储 前端开发 Java
Springboot静态资源映射及文件映射
在Spring Boot项目中,为了解决前端访问后端存储的图片问题,起初尝试通过静态资源映射实现,但发现这种方式仅能访问打包时已存在的文件。对于动态上传的图片(如头像),需采用资源映射配置,将特定路径映射到服务器上的文件夹,确保新上传的图片能即时访问。例如,通过`addResourceHandler(&quot;/img/**&quot;).addResourceLocations(&quot;file:E:\\myProject\\forum_server\\&quot;)`配置,使前端可通过URL直接访问图片。
829 0
Springboot静态资源映射及文件映射
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
1341 0
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
1214 0
|
Java API 开发者
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——slf4j 介绍
在软件开发中,`System.out.println()`常被用于打印信息,但大量使用会增加资源消耗。实际项目推荐使用slf4j结合logback输出日志,效率更高。Slf4j(Simple Logging Facade for Java)是一个日志门面,允许开发者通过统一方式记录日志,无需关心具体日志系统。它支持灵活切换日志实现(如log4j或logback),且具备简洁占位符和日志级别判断等优势。阿里巴巴《Java开发手册》强制要求使用slf4j,以保证日志处理方式的统一性和维护性。使用时只需通过`LoggerFactory`创建日志实例即可。
799 0
|
11月前
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
1063 54