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() 这样的方式来输出信息非常直接且易于实现,但在生产环境中的大型或复杂应用中,这种方式存在诸多不足:
- 性能问题:频繁地调用System.out.println()会占用额外的CPU资源,尤其是在高并发场景下,可能会影响应用程序的性能。
- 日志管理不便:控制台输出的日志不易于长期保存和检索,也不便于与其他工具集成以进行更高级的日志分析。
- 缺乏灵活性:通过System.out.println()输出的信息通常难以调整其格式、级别(如DEBUG, INFO, WARN, ERROR)或输出目标(例如文件、数据库、远程服务器等)。
- 安全性和隐私:在某些情况下,直接打印敏感信息可能会泄露用户的个人数据或公司的商业秘密。
1.2 日志的用途
通过前面的学习,我们知道日志主要是为了发现问题,分析问题,定位问题的,除此之外,日志还有很多用途
-
系统监控
监控现在几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,每一个方法的响应时间,响应状态等,对数据进行分析,设置不同的规则,超过阈值时进行报警。比如统计日志中关键字的数量,并在关键字数量达到一定条件时报警,这也是日志的常见需求之一 -
数据采集
数据采集是一个比较大的范围,采集的数据可以作用在很多方面,比如数据统计,推荐排序等。2.1 数据统计:统计页面的浏览量(PV),访客量(UV),点击量等,根据这些数据进行数据分析,优化公司运营策略
2.2推荐排序:目前推荐排序应用在各个领域,我们经常接触的各行各业很多也都涉及推荐排序,比如购物,广告,新闻等领域。数据采集是推荐排序工作中必须做的一环,系统通过日志记录用户的浏览历史,停留时长等,算法人员通过分析这些数据,训练模型,给用户做推荐。
-
日志审计
随着互联网的发展,众多企业的关键业务越来越多的运行于网络之上。网络安全越来越受到大家的关注,系统安全也成为了项目中的一个重要环节,安全审计也是系统中非常重要的部分。国家的政策法规、行业标准等都明确对日志审计提出了要求。通过系统日志分析,可以判断一些非法攻击,非法调用,以及系统处理过程中的安全隐患。
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优点
- 减少了系统的相互依赖.: 实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端;
- 提高了灵活性: 简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可
- 提高了安全性 : 可以灵活设定访问权限,不在门面对象中开通方法,就无法访问
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日志持久化
保存为文件,有两种方式
- 配置日志文件名
- 配置日志的存储目录
配置文件名:
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给我们提供了一种更简单的方式。
- 添加Llombok框架支持
- 使用 @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("--------------要输出⽇志的内容----------------");
}
}
总结
- 日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题
- SpringBoot内容了日志框架,默认情况下使用的是info日志级别将日志输出到控制台的,我们可以通过lombok提供的@Slf4j注解和 log 对象快速的打印自定义日志。
- 日志包含6个级别,日志级别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称