日志是开发项目中非常重要的一个环节,它是程序员在检查程序运行的手段之一。
1.日志的基础操作
1.1 日志的作用
- 编程期调试代码
- 运营期记录信息:
* 记录日常运营重要信息(峰值流量、平均响应时长……)
* 记录应用报错信息(错误堆栈)
* 记录运维过程数据(扩容、宕机、报警……)
1.2 日志级别
使用方式:
2.快速开发日志对象
2.1 日志门面库
日志门面库
是一种软件设计模式
,它为多种不同的日志记录框架
提供一个统一的接口或抽象层。这种模式允许开发者使用一个通用的API来编写日志记录代码,而不必直接依赖于任何特定的日志框架
实现。
看到这里有很多人可能看不明白,我们用人话讲一下,日志记录框架就是我们经常用到的logback或者log4j,各种类型的日志记录框架应用场景不同,可能开发时候你用到的框架不满足线上的要求,那你此时就需要更换日志记录框架,而如果你使用了日志门面库,此时你只需要如下操作:
- 在开发阶段,你可以选择一个日志实现(如logback),并通过添加相应的依赖和配置文件(如logback.xml)来配置它。
- 切换日志实现:如果你需要更换为另一个日志实现(如log4j),你只需做以下几步:
- 移除当前日志实现(logback)的依赖和配置文件。
- 添加新日志实现(log4j)的依赖和配置文件(如log4j.properties或log4j.xml)。
- 无需修改代码中使用日志门面库API的任何部分。
2.2 日志实现
日志记录框架
是用于记录和管理系统操作事件
的软件组件。它们帮助开发者在程序运行时捕获、存储和分析日志信息,这对于调试、监控和审计系统行为至关重要。以下是一些主流的日志记录框架及其特点,他有如下实现:
- Logback:由Log4j的原开发者之一主导开发,是Spring Boot默认的日志框架,轻量级且性能优秀,功能全面。
- Log4j:一个非常老牌的日志框架,功能强大,可以自定义日志级别、输出格式和目的地等。
- Log4j2:Log4j的升级版,性能和功能上都有所提升,支持异步日志和插件机制。
- JUL(Java Util Logging):Java SE的默认日志框架,功能相对基础,但对于简单的日志需求来说足够用。
2.3 SLF4J
SLF4J
是一个Java日志门面库
,它提供了一个简单而统一的API来记录日志,同时允许最终用户在部署他们的应用程序时插入所需的日志框架。简而言之,SLF4J定义了一个日志记录的接口,然后通过桥接与其他具体的日志框架(如logback、log4j等)进行集成,使得开发者可以在代码中使用SLF4J API,而具体的日志实现则可以在部署时决定。
SLF4J的主要特点包括:
- 简单性:SLF4J提供了一个简单直观的API,使得日志记录变得容易。
- 解耦:由于SLF4J是一个门面,它允许开发者在不了解具体日志实现的情况下编写代码,这使得代码与具体的日志框架解耦。
- 灵活性:开发者可以在运行时选择使用哪种日志系统,例如logback、log4j、java.util.logging等。
- 性能:SLF4J的API设计注重性能,特别是在参数较多的情况下,它允许延迟参数计算,直到日志级别真正启用时才计算参数值。
- 兼容性:SLF4J支持与多种日志框架的桥接,这意味着你可以在项目中轻松切换不同的日志系统。
- 线程安全:SLF4J是线程安全的,可以在多线程环境中使用。
使用SLF4J的基本步骤:
- 添加依赖:在项目的构建配置中添加SLF4J的依赖。
- 配置日志系统:选择并配置一个日志系统,如logback或log4j。
- 编写代码:在代码中使用SLF4J提供的API来记录日志。
- 运行和部署:在部署时,根据需要选择和配置具体的日志实现。
示例代码:
在Controller
层添加slf4j
的注解(lombok提供
),即可在相应的Controller
方法中使用log.
调用API
它由loggerFactory方法获取到:
他有如下方法:
3. 日志的信息
3.1 日志的格式
一个标准的,springboot默认的日志格式输出信息如下:
我们也可以自定义设置日志的输出格式,例如可能有的人不想显示PID的信息,只想知道时间,级别和日志信息,我们就可以手动调整。
logging:
level:
root: INFO
org.springframework.web: INFO
org.hibernate: WARN
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n%throwable"
属性解释:
- logging.level: 配置日志级别。这里设置了根日志级别为INFO,并为特定的包(如org.springframework.web和org.hibernate)设置了不同的日志级别。
- logging.pattern.console: 配置控制台日志输出格式,格式可以包含:
* %d{yyyy-MM-dd HH:mm:ss}:日志时间戳
* %-5level:日志级别(INFO、DEBUG等),宽度为5
* [%thread]:线程名称
* %logger{36}:日志记录器的名称(通常是类的名称),最多显示36个字符
* %msg:日志消息
* %n:换行
* %throwable:异常堆栈
3.2 输出日志
在配置中我们可以添加file属性来设置输出日志的格式以及位置
logging:
level:
root: INFO
org.springframework.web: INFO
org.hibernate: WARN
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n%throwable"
file: "%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n%throwable"
file:
name: info.log # 设置日志输出文件路径
- logging.pattern.file: 配置日志文件的输出格式,使用相同的格式。
- logging.file.name: 配置日志文件输出路径,可以指定一个文件名或完整路径。
那么这个文件在哪呢?就在你的项目文件里面,打开就能看到
我重启了几次项目,看看记录的信息: