国庆节10月1日
--


Java日志技术概述、Logback入门配置、日志级别与@Slf4j注解实战
日志用于记录应用程序的运行信息、状态信息和错误信息。专业的日志框架(如 Logback)替代 System.out.println,提供灵活的日志级别控制、多种输出目标(控制台/文件)和格式化能力。
使用 System.out.println(...) 记录日志的缺陷:
| 框架 | 特点 |
|---|---|
| JUL | JavaSE 官方日志框架,配置简单但不够灵活,性能较差 |
| Log4j | 流行的日志框架,灵活的配置选项,支持多种输出目标 |
| Logback | 基于 Log4j 升级,更多功能和配置选项,性能优于 Log4j |
| Slf4j | 简单日志门面,提供标准接口,允许切换底层日志框架 |
SpringBoot 已内置传递 Logback 依赖,无需额外引入。若单独使用:
1<dependency>2 <groupId>ch.qos.logback</groupId>3 <artifactId>logback-classic</artifactId>4 <version>1.4.11</version>5</dependency>放置在 src/main/resources 目录下:
1<?xml version="1.0" encoding="UTF-8"?>2<configuration>3 <!-- 控制台输出 -->4 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">5 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">6 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>7 </encoder>8 </appender>9
10 <!-- 日志输出级别 -->11 <root level="ALL">12 <appender-ref ref="STDOUT" />13 </root>14</configuration>1public class LogTest {2 private static final Logger log = LoggerFactory.getLogger(LogTest.class);3
4 @Test5 public void testLog() {6 log.debug("开始计算...");7 int sum = 0;8 int[] nums = {1, 5, 3, 2, 1, 4, 5, 4, 6, 7, 4, 34, 2, 23};9 for (int i = 0; i < nums.length; i++) {10 sum += nums[i];11 }12 log.info("计算结果为: " + sum);13 log.debug("结束计算...");14 }15}Pattern 格式化占位符说明:
| 占位符 | 含义 |
|---|---|
%d | 日期 |
%thread | 线程名 |
%-5level | 日志级别,左对齐 5 字符宽度 |
%logger{50} | Logger 名称,最长 50 字符 |
%msg | 日志消息 |
%n | 换行符 |
1<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">2 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">3 <FileNamePattern>D:/tlias-%d{yyyy-MM-dd}-%i.log</FileNamePattern>4 <MaxHistory>30</MaxHistory>5 <maxFileSize>10MB</maxFileSize>6 </rollingPolicy>7 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">8 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>9 </encoder>10</appender>关键配置项:
| 配置项 | 说明 |
|---|---|
FileNamePattern | 日志文件名模式,%i 表示序号 |
MaxHistory | 最多保留的历史日志文件数量 |
maxFileSize | 单个文件最大大小,超出触发滚动 |
级别由低到高:TRACE → DEBUG → INFO → WARN → ERROR
<root level="info"> 表示仅输出大于等于 INFO 级别的日志(INFO / WARN / ERROR),DEBUG 和 TRACE 不会输出。
常用配置:
1<root level="info">2 <appender-ref ref="STDOUT" />3 <appender-ref ref="FILE" />4</root>| 配置值 | 效果 |
|---|---|
| ALL | 输出所有级别日志 |
| OFF | 关闭所有日志 |
| INFO | 仅输出 INFO、WARN、ERROR(生产环境推荐) |
| DEBUG | 输出 DEBUG 及以上(开发调试推荐) |
Lombok 提供的 @Slf4j 注解可简化日志记录器定义,等价于:
1private static Logger log = LoggerFactory.getLogger(Xxx.class);在 DeptController 中应用:
1@Slf4j2@RequestMapping("/depts")3@RestController4public class DeptController {5
6 @Autowired7 private DeptService deptService;8
9 @GetMapping10 public Result list() {11 log.info("查询部门列表");12 List<Dept> deptList = deptService.findAll();13 return Result.success(deptList);14 }15
16 @DeleteMapping17 public Result delete(Integer id) {18 log.info("根据id删除部门, id: {}", id);19 deptService.deleteById(id);20 return Result.success();21 }22
23 @PostMapping24 public Result save(@RequestBody Dept dept) {25 log.info("新增部门, dept: {}", dept);26 deptService.save(dept);27 return Result.success();28 }29
30 @GetMapping("/{id}")31 public Result getById(@PathVariable Integer id) {32 log.info("根据ID查询, id: {}", id);33 Dept dept = deptService.getById(id);34 return Result.success(dept);35 }36
37 @PutMapping38 public Result update(@RequestBody Dept dept) {39 log.info("修改部门, dept: {}", dept);40 deptService.update(dept);41 return Result.success();42 }43}使用
log.info("xxx {}", var)占位符风格替代字符串拼接,性能更优。
logback.xml 需放在 src/main/resources 下@Slf4j 注解可省略手动定义 Logger{} 占位符而非字符串拼接System.out.println,应统一使用日志框架如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"所有的相遇都是久别重逢。"—— 未知


