SpringBoot日志

**摘要:**本文围绕 Java 开发中的日志使用展开,首先介绍日志在问题定位、系统监控、数据采集和日志审计等方面的用途,随后讲解 Spring Boot 内置的 SLF4J 日志框架,包括日志对象的获取、日志输出方法、日志级别分类与使用,以及日志的持久化和格式配置等实践内容。

1. 日志概述

为什么要学习日志

日志对我们来说并不陌生,从 Java SE 部分,我们就在使用 System.out.print 来打印日志了。通过打印日志来发现和定位问题,或者根据日志来分析程序的运行过程。在 Spring 的学习中,也经常根据控制台的日志来分析和定位问题。

随着项目的复杂度提升,我们对日志的打印也有了更高的需求,而且不仅仅是定位排查问题。

比如需要记录一些用户的操作记录(一些审计公司会要求),也可能需要使用日志来记录用户的一些喜好,把日志持久化,后续进行数据分析等。但是 System.out.print 不能很好地满足我们的需求,我们就需要使用一些专门的日志框架(专业的事情交给专业的人去做)。

日志的用途

通过前面的学习,我们知道日志主要是为了发现问题、分析问题、定位问题的,但除此之外,日志还有很多用途:

  1. 系统监控

系统监控现在几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态、每一个方法的响应时间、响应状态等,对数据进行分析,设置不同的规则,超过阈值时进行报警。比如统计日志中的关键字的数量,并在关键字数量达到一定条件时报警,这也是日志常见需求之一。

  1. 数据采集

数据采集是一个比较大的范围,采集的数据可以作用在很多方面,比如数据统计、推荐排序等。

  • 数据统计:统计页面的浏览量(PV)、访问量(UV)、点击量等,根据这些数据进行数据分析,优化公司运营策略。
  • 推荐排序:目前推荐排序应用在各个领域,我们经常接触的各行各业很多也都涉及推荐排序,比如购物、广告、新闻等领域。数据采集是推荐排序工作中必须做的一环,系统通过日志记录用户的浏览历史、停留时长等,算法人员通过这些数据,训练模型,给用户做推荐。

下图中的数据源,其中一部分就来自于记录的数据:

  1. 日志审计

随着互联网的发展,众多企业的关键业务越来越多的运行于网络之上。网络安全越来越受到大家的关注,系统安全也成为了一个项目中的一个重要环节,安全审计也是系统中非常重要的部分。国家的政策法规、行业标准等都明确对日志审计提出了要求。通过系统日志分析,可以判断一些非法攻击、非法调用,以及系统处理过程中的安全隐患。

比如,大家平时都在做运营系统,其中运营人员通过界面处理一些数据的时候,如果没有清楚的日志操作记录,一条数据被删除或修改,你是无法找到是谁操作的,但是如果你做了相应的记录,该数据被谁删除或者修改就会一目了然。

2. 日志使用

Spring Boot项目在启动的时候默认就有日志输出,如下图所示:

它打印的日志和 System.out.print 有什么不同呢?

java 复制代码
@RestController
public class LoggerController {
    @RequestMapping("/logger")
    public String logger(){
        System.out.println("打印日志");
        return "打印日志";
    }
}

观察日志输出

可以看到,我们通过 System.out.print 打印的日志比 Spring Boot 打印的日志缺少了很多信息。

Spring Boot 内置了日志框架 SLF4J,我们可以直接在程序中调用 SLF4J 来输出日志。

2.1 打印日志

打印日志的步骤:

  • 在程序中得到日志对象
  • 使用日志对象输出要打印的内容
2.1.1 在程序中得到日志对象

在程序中获取日志对象需要使用日志工厂LoggerFactory,如下代码所示:

复制代码
private static Logger logger= LoggerFactory.getLogger(LoggerController.class);

注意:Logger 对象是属于 org.slf4j 包下的。

2.1.2 使用日志对象打印日志

日志对象的打印方法有很多种,我们可以先使用info()方法来输出日志.如下代码所示:

java 复制代码
@RestController
public class DemoController {

    private static Logger logger= LoggerFactory.getLogger(DemoController.class);

    @RequestMapping("/logger")
    public String logger(){
        logger.info("打印日志");
        return "打印日志";
    }
}

2.2SLF4J框架介绍

SLF4J就是其他日志框架的门面.SLF4J可以理解为是提供日志服务的统一API接口,并不涉及到具体日志逻辑实现.

2.3日志说明

从上图可以看到,日志输出内容元素具体如下:

  1. 时间日期:精确到毫秒
  2. 日志级别:ERROR、WARN、INFO、DEBUG 或 TRACE
  3. 进程 ID
  4. 线程名
  5. Logger 名(通常使用源代码的类名)
  6. 日志内容

2.4 日志级别

2.4.1 日志级别的分类

日志级别从高到低依次分为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE

  • FATAL:致命错误,表示需要立即被处理的系统级错误
  • ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行
  • WARN:警告信息,不影响使用,但需要注意的问题
  • INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等
  • DEBUG:调试信息,需要调试时候的关键信息打印
  • TRACE:追踪信息,比 DEBUG 更细粒度的信息事件

日志级别的顺序:

级别越高,收到的消息越少.

2.4.2 日志级别的使用
java 复制代码
@RestController
public class DemoController {

    private static Logger logger= LoggerFactory.getLogger(DemoController.class);

    @RequestMapping("/logger")
    public String logger(){
        logger.error("打印日志");
        logger.warn("打印日志");
        logger.info("打印日志");
        logger.debug("打印日志");
        logger.trace("打印日志");
        return "打印日志";
    }
}

观察打印的日志结果:

2.5 日志配置

2.5.1 配置日志级别

日志级别配置只需要在配置文件中设置"logging.level"配置项即可,如下所示:

复制代码
logging.level.root=debug
2.5.2 日志持久化

日志持久化有两种方式

  1. 配置日志文件名
  2. 配置日志的存储目录

配置日志文件的路径和文件名:

复制代码
logging.file.name=logger/springboot.log

运行结果显示,日志内容保存在了对应的目录下

配置日志文件的保存路径

复制代码
logging.file.path=D:/temp

这种方式只能设置日志的路径,文件名为固定的spring.log

注意:

logging.file.name和logging.file.path两个都配置的情况下,.只生效其一,以logging.file.name为准

2.5.3 配置日志格式

目前日志打印的格式是默认的

打印日志的格式,也是配置支持配置的.支持控制台和日志文件分别设置

相关推荐
迷迭香yy1 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
格林威1 小时前
C#图像快速剪切:使用OpenCvSharp和Halcon优化图像剪切和CPU占用
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
DianSan_ERP1 小时前
WMS接入电商平台自动化履约实战:一张订单从平台到出库的接口时序设计
java·前端·网络·数据库·安全·架构·自动化
liangsheng_g2 小时前
微服务本地开发零配置隔离方案
java·微服务·架构
知识分享小能手2 小时前
概理论与数理统计学习教程,从入门到精通,在数理统计中应用R软件(22)
开发语言·学习·r语言
不服老的小黑哥2 小时前
六、集合处理(collections.md)
java
乐观勇敢坚强的老彭2 小时前
C++信奥GESP四级的常见题型和解题模板速查表
开发语言·c++
denggun123452 小时前
信号量(DispatchSemaphore vs AsyncSemaphore)、swift协作式线程池 and python信号量
开发语言·python·swift
lisw052 小时前
计算与科学哲学(Philosophy of Computing and Science)
java·开发语言·人工智能