当前位置: 首页 > news >正文

SpringBoot日志

文章目录

  • 1.日志概述
    • 1.2 日志的用途
  • 2.Java中的日志框架
    • 2.1抽象的日志框架
    • 2.2具体的日志框架
  • 3.门面模式(外观模式)
    • 3.1 定义
    • 3.2优点
  • 4.日志级别
    • 4.1日志格式的说明
    • 4.2日志的使用
    • 4.3日志级别的使用
    • 4.4配置日志级别
    • 4.5日志的粗粒度
    • 4.6日志持久化
    • 4.7滚动日志
    • 4.8日志框架切换
  • 5.使用注解输出日志
  • 总结

1.日志概述

日志记录是一种关键的技术实践,用于捕捉软件运行时的信息、警告、错误以及其他重要数据。通过分析日志文件,开发人员、测试工程师和运维团队可以深入了解应用程序的行为,快速定位并解决出现的问题,同时对系统性能进行监控与优化。

虽然在开发初期或简单的应用场景下,使用System.out.println() 这样的方式来输出信息非常直接且易于实现,但在生产环境中的大型或复杂应用中,这种方式存在诸多不足:

  1. 性能问题:频繁地调用System.out.println()会占用额外的CPU资源,尤其是在高并发场景下,可能会影响应用程序的性能。
  2. 日志管理不便:控制台输出的日志不易于长期保存和检索,也不便于与其他工具集成以进行更高级的日志分析。
  3. 缺乏灵活性:通过System.out.println()输出的信息通常难以调整其格式、级别(如DEBUG, INFO, WARN, ERROR)或输出目标(例如文件、数据库、远程服务器等)。
  4. 安全性和隐私:在某些情况下,直接打印敏感信息可能会泄露用户的个人数据或公司的商业秘密。

1.2 日志的用途

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

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

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

    2.1 数据统计:统计页面的浏览量(PV),访客量(UV),点击量等,根据这些数据进行数据分析,优化公司运营策略

    2.2推荐排序:目前推荐排序应用在各个领域,我们经常接触的各行各业很多也都涉及推荐排序,比如购物,广告,新闻等领域。数据采集是推荐排序工作中必须做的一环,系统通过日志记录用户的浏览历史,停留时长等,算法人员通过分析这些数据,训练模型,给用户做推荐。

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

2.Java中的日志框架

在这里插入图片描述
SLF4J不同于其他日志框架,它不是一个真正的日志实现,而是一个抽象层,对日志框架制定的一种规范,标准,接口。所有SLF4J并不能独立使用,需要和具体的日志框架配合使用

2.1抽象的日志框架

什么是抽象的日志框架?
编译阶段可以使用这些抽象的日志框架,能够正常编译通过,但运行阶段必须提供具体的日志框架,这样做的目的是:具体的日志框架可灵活切换。
SLF4J (Simple Logging Facade for Java)

  • 简介:SLF4J不是一个具体的日志实现,而是一个简单的抽象层,允许开发者在应用程序中使用统一的日志API,而实际的日志实现可以在部署时决定。
  • 特点:提供了统一的日志记录接口,使得日志框架的选择更加灵活,易于切换不同的日志实现,减少了应用程序对特定日志框架的依赖。

运行时可绑定的具体日志框架:Log4j、Log4j2、Logback、JUL。
● Commons Logging (Jakarta Commons Logging)

  • 简介:Commons Logging是Apache Jakarta项目的一部分。也是一种日志层面的抽象。

  • 特点:允许在运行时动态选择日志实现,但因类加载机制的问题,有时会导致难以预料的行为,因此不如SLF4J受欢迎。

运行时可绑定的具体日志框架:Log4j、Log4j2、Logback、JUL。

2.2具体的日志框架

● Log4j(太老,没人用了)

  • 简介:Log4j是Apache软件基金会的一个开源项目,它提供了强大的日志记录功能,支持多种日志级别(如DEBUG, INFO, WARN, ERROR, FATAL)、灵活的日志输出格式和目的地配置

  • 特点:易于配置和使用,支持日志滚动策略,适用于中小规模的应用

● Log4j 2

  • 简介:Log4j 2是Log4j的下一代版本,旨在解决原版的一些性能瓶颈和设计缺陷。

  • 特点:性能更优,支持插件化配置,增强了安全性,支持异步日志记录,减少了线程间的竞争,提高了日志记录的速度。

● Logback

  • 简介:Logback是Log4j的创始人Ceki Gülcü开发的另一个日志框架,设计之初就考虑到了性能和可靠性。
  • 特点:与SLF4J无缝集成,提供了比Log4j更好的性能表现,支持自动重载配置文件,具有更简洁的API和更少的bug。

● JUL (Java Util Logging)

  • 简介:JUL是Java SE平台自带的日志框架,从Java 1.4版本开始提供。
  • 特点:不需要额外的库文件,配置相对简单,适合小型应用。然而,相对于其他流行的日志框架,JUL的功能较为有限,配置不够灵活。

这些日志框架各有优势,选择哪一种取决于项目的具体需求、团队的偏好以及现有的技术栈。例如,对于需要高性能和灵活配置的应用,Logback或Log4j 2可能是更好的选择;而对于希望减少对外部库依赖的小型项目,JUL可能更为合适。

3.门面模式(外观模式)

SLF4J是门面模式的典型应用

3.1 定义

提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用。
在这里插入图片描述

门面模式主要包含2种角色:
外观角色(Facade):也称门面角色,系统对外的统一接口。

子系统角色(SubSystem):可以同时有一个或多个SubSystem.每个SubSytem都不是一个单独的类,而是一个类的集合. SubSystem并不知道Facade的存在,对于SubSystem而言, Facade只是另一个客户端而已(即Facade对SubSystem透明)

举例:

去医院看病,可能要去挂号,门诊,化验,取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。

在这里插入图片描述

3.2优点

  1. 减少了系统的相互依赖.: 实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端;
  2. 提高了灵活性: 简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可
  3. 提高了安全性 : 可以灵活设定访问权限,不在门面对象中开通方法,就无法访问

4.日志级别

在Java的日志框架中,日志级别(Log Level)是用来指定日志记录的严重程度的一个标准。不同的日志级别代表了不同的重要性和紧急程度,这有助于开发者根据实际需要来过滤和关注特定类型的日志信息

常见的日志级别从低到高通常包括以下几种:

日志级别用途
TRACE用于记录最详细的信息 、通常用于调试阶段
DEBUG用于记录程序运行时的详细信息、主要用于开发阶段的调试
INFO记录应用程序的一般信息,如系统启动、服务初始化完成等
WARN警告信息, 表示可能存在问题或者异常的情况
ERROR错误信息,表示发生了一个错误事件
FATAL灾难级别的信息,表示服务已经出现了某种程度的不可用

通过设置不同的日志级别,可以在生产环境中控制输出的日志量,从而减少对性能的影响

例如:
● 在生产环境中,我们可能会将日志级别设置为INFO或更高级别,以避免输出过多的调试信息
● 而在开发或测试环境中,则可以将日志级别降低至DEBUG甚至TRACE,以便于进行详细的错误追踪和调试

级别越低,打印的日志信息越多

SpringBoot默认的日志级别是INFO

SpringBoot默认将日志打印到控制台

4.1日志格式的说明

在这里插入图片描述
从左到右输出的内容对应的分别是
时间日期:精确到毫秒
日志级别:ERROR,WARN,INFO,DEBUG或TRACE
进程ID
模块名称
线程名
Logger名(通常使用源代码的类名)
日志内容

4.2日志的使用

1.使用日志工厂LoggerFactory获取日志对象

    private final static Logger logger= LoggerFactory.getLogger(LogController.class);
    //LoggerFactory.getLogger需要传递⼀个参数,标识这个⽇志的名称

2.导入包

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

3.打印日志

logger.info("===========sout打印日志===========");

4.3日志级别的使用

打印不同级别的日志

@RequestMapping("/printLog")
public String printLog() {
 logger.trace("================= trace ===============");
 logger.debug("================= debug ===============");
 logger.info("================= info ===============");
 logger.warn("================= warn ===============");
 logger.error("================= error ===============");
 return "打印不同级别的⽇志" ;
}

SpringBoot默认的日志框架是Logback, Logback没有 FATAL 级别,它被映射到 ERROR.
出现fatal日志,表示服务已经出现了某种程度的不可用,需要需要系统管理员紧急介入处理。通常情况下,一个进程生命周期中应该最多只有一次FATAL记录。

观察结果:
在这里插入图片描述
发现只打印了INFO,WARN和ERROR的日志信息,这与日志级别的配置有关,日志的输出级别默认是INFO级别,所以只会打印大于等于此级别的日志

4.4配置日志级别

在application.yml设置

logging:
  level:
    root: trace

在properties.yml设置

logging.level.root=trace

就会打印以下信息:
在这里插入图片描述

4.5日志的粗粒度

设置根日志级别为 INFO

logging:
  level:
    root: INFO

为特定的包设置日志级别为 DEBUG

logging:
  level:
    com:
      demo:
        service: DEBUG

为特定的类设置日志级别为 TRACE

logging:
  level:
    com:
      demo:
        service:
          MyService: Trace

4.6日志持久化

保存为文件,有两种方式

  1. 配置日志文件名
  2. 配置日志的存储目录
    在这里插入图片描述
    配置文件名:
    Properties配置
logging.file.name=logger/springboot.log

yml配置

logging:
  file:
    name: logger/springboot.log

配置路径
Properties配置

logging.file.path=D:/test

yml配置

logging:
  file:
    path: D:/test

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

4.7滚动日志

滚动日志是一种日志管理机制,用于防止日志文件无限增长,通过将日志文件分割成多个文件,每个文件只包含一定时间段或大小的日志记录。

滚动日志可以帮助你更好地管理和维护日志文件,避免单个日志文件过大导致难以处理。

# 日志文件达到多大时进行归档
logging.logback.rollingpolicy.max-file-size=100MB

# 所有的归档日志文件总共达到多大时进行删除,默认是0B表示不删除
logging.logback.rollingpolicy.total-size-cap=50GB

# 归档日志文件最多保留几天
logging.logback.rollingpolicy.max-history=60

# 启动项目时是否要清理归档日志文件
logging.logback.rollingpolicy.clean-history-on-start=false

# 归档日志文件名的格式
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz

4.8日志框架切换

在实际开发中也可能会切换日志框架,按照如下配置进行切换:先排除掉,再添加

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!--排除掉默认的日志依赖-->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!--使用Log4j2日志依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

注意:一旦切换到Log4j2的日志框架,对于之前的配置来说,只有logback的滚动日志不再生效,其他配置仍然生效。如果要在log4j2中进行滚动日志,需要编写log4j2相关的xml配置文件,比较麻烦。

5.使用注解输出日志

每次都使用LoggerFactory. getLogger()方法很繁琐,且每个类都添加一遍, lombok给我们提供了一种更简单的方式。

  1. 添加Llombok框架支持
  2. 使用 @slf4j 注解输出日志。

添加依赖

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>

lombok提供的 @Slf4j 会帮我们提供⼀个⽇志对象log,我们直接使用就可以.
输出日志

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogController {
 public void log(){
 log.info("--------------要输出⽇志的内容----------------");
 }
}

总结

  1. 日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题
  2. SpringBoot内容了日志框架,默认情况下使用的是info日志级别将日志输出到控制台的,我们可以通过lombok提供的@Slf4j注解和 log 对象快速的打印自定义日志。
  3. 日志包含6个级别,日志级别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称

相关文章:

  • 代码训练day25回溯p4
  • 嵌入式程序设计英语
  • java: 需要‘)‘ java: 未结束的字符串文字,java: 不是语句,怎么解决
  • C++ (初始C++,命名空间,引用,函数增强)
  • Java-分布式锁tryLock(0, TimeUnit.SECONDS)中0的含义
  • 大模型中提到的分词器是什么
  • C++算法优化实战:破解性能瓶颈,提升程序效率
  • 【AI】使用 Hugging Face Transformers 进行文本摘要实现
  • (2)VTK C++开发示例 --- 绘制多面锥体
  • 预防WIFI攻击,保证网络安全
  • 《植物大战僵尸融合版v2.4.1》,塔防与创新融合的完美碰撞
  • RHCE第五章:NFS服务器
  • 前端操作document的小方法,主要功能-获取当前页面全部的a标签页,并根据链接中必要的字段进行判断,然后把这些链接放入iframe去打开
  • 【Windows】系统安全移除移动存储设备指南:告别「设备被占用」弹窗
  • UE5蓝图实现打开和关闭界面、退出
  • 使用人工智能大模型腾讯元宝,如何快速些成果申报书?
  • C/C++基础
  • 基于 DB、EAST、SAST 的文本检测算法详解及应用综述
  • VSCode写java时常用的快捷键
  • 【KWDB 创作者计划】_产品技术解读_2
  • 特朗普亲自介入美日关税谈判:以势压人还是给对手“送助攻”
  • 女子拿蘸料时触电受伤,海底捞回应
  • 电动自行车新国标将于9月1日落地,首批6家检测机构出炉
  • 海港主场不敌蓉城遭遇联赛首败,好消息是武磊终于复出了
  • 吕治国执掌全国唯一的热带海洋大学,曾从教育部“空降”海南
  • 杭州一地铁口建筑被吐槽像棺材,官方回应:暂无拆除计划