Loading
923 字
5 分钟

日志技术

AI 摘要

日志技术#

定义#

日志用于记录应用程序的运行信息、状态信息和错误信息。专业的日志框架(如 Logback)替代 System.out.println,提供灵活的日志级别控制、多种输出目标(控制台/文件)和格式化能力。

为什么需要日志框架#

使用 System.out.println(...) 记录日志的缺陷:

  • 硬编码:无法灵活控制输出与否,只能删除代码
  • 输出受限:只能输出到控制台
  • 不便于扩展维护:无法按级别过滤、按格式输出

日志框架对比#

框架特点
JULJavaSE 官方日志框架,配置简单但不够灵活,性能较差
Log4j流行的日志框架,灵活的配置选项,支持多种输出目标
Logback基于 Log4j 升级,更多功能和配置选项,性能优于 Log4j
Slf4j简单日志门面,提供标准接口,允许切换底层日志框架

Logback 入门#

依赖引入#

SpringBoot 已内置传递 Logback 依赖,无需额外引入。若单独使用:

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.11</version>
</dependency>

配置文件 logback.xml#

放置在 src/main/resources 目录下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="ALL">
<appender-ref ref="STDOUT" />
</root>
</configuration>

基本使用#

public class LogTest {
private static final Logger log = LoggerFactory.getLogger(LogTest.class);
@Test
public void testLog() {
log.debug("开始计算...");
int sum = 0;
int[] nums = {1, 5, 3, 2, 1, 4, 5, 4, 6, 7, 4, 34, 2, 23};
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
log.info("计算结果为: " + sum);
log.debug("结束计算...");
}
}

Pattern 格式化占位符说明:

占位符含义
%d日期
%thread线程名
%-5level日志级别,左对齐 5 字符宽度
%logger{50}Logger 名称,最长 50 字符
%msg日志消息
%n换行符

输出到文件#

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>D:/tlias-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
</encoder>
</appender>

关键配置项:

配置项说明
FileNamePattern日志文件名模式,%i 表示序号
MaxHistory最多保留的历史日志文件数量
maxFileSize单个文件最大大小,超出触发滚动

日志级别#

级别由低到高:TRACE → DEBUG → INFO → WARN → ERROR

<root level="info"> 表示仅输出大于等于 INFO 级别的日志(INFO / WARN / ERROR),DEBUG 和 TRACE 不会输出。

常用配置:

<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
配置值效果
ALL输出所有级别日志
OFF关闭所有日志
INFO仅输出 INFO、WARN、ERROR(生产环境推荐)
DEBUG输出 DEBUG 及以上(开发调试推荐)

案例实战:@Slf4j 注解#

Lombok 提供的 @Slf4j 注解可简化日志记录器定义,等价于:

private static Logger log = LoggerFactory.getLogger(Xxx.class);

在 DeptController 中应用:

@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@GetMapping
public Result list() {
log.info("查询部门列表");
List<Dept> deptList = deptService.findAll();
return Result.success(deptList);
}
@DeleteMapping
public Result delete(Integer id) {
log.info("根据id删除部门, id: {}", id);
deptService.deleteById(id);
return Result.success();
}
@PostMapping
public Result save(@RequestBody Dept dept) {
log.info("新增部门, dept: {}", dept);
deptService.save(dept);
return Result.success();
}
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) {
log.info("根据ID查询, id: {}", id);
Dept dept = deptService.getById(id);
return Result.success(dept);
}
@PutMapping
public Result update(@RequestBody Dept dept) {
log.info("修改部门, dept: {}", dept);
deptService.update(dept);
return Result.success();
}
}

使用 log.info("xxx {}", var) 占位符风格替代字符串拼接,性能更优。

常见场景#

  • 生产环境设为 INFO 级别记录关键业务操作
  • 开发调试时设为 DEBUG 级别查看详细执行过程
  • 将日志输出到文件并按日期/大小滚动,便于持久化追踪

注意事项#

  • SpringBoot 已内置 Logback,无需额外引入依赖
  • logback.xml 需放在 src/main/resources
  • 使用 @Slf4j 注解可省略手动定义 Logger
  • 日志消息推荐使用 {} 占位符而非字符串拼接
  • 生产环境不建议使用 System.out.println,应统一使用日志框架

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
日志技术
https://blog.tsh520.cn/posts/javawebai/后端基础/日志技术/
作者
团子和蛋糕
发布于
2026-05-22
许可协议
CC BY-NC-SA 4.0

评论区

[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:00 0:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]
我和宝宝在一起已经
---------TSH CXY---------
---------TSH
CXY---------
0 0 0
00 00 00
最近更新
站点统计
文章
84
动态
20
记录次数
89
分类
6
标签
78
总字数
94,329
运行时长
0
最后活动
0 天前