923 字
5 分钟
日志技术
AI 摘要
日志技术
定义
日志用于记录应用程序的运行信息、状态信息和错误信息。专业的日志框架(如 Logback)替代 System.out.println,提供灵活的日志级别控制、多种输出目标(控制台/文件)和格式化能力。
为什么需要日志框架
使用 System.out.println(...) 记录日志的缺陷:
- 硬编码:无法灵活控制输出与否,只能删除代码
- 输出受限:只能输出到控制台
- 不便于扩展维护:无法按级别过滤、按格式输出
日志框架对比
| 框架 | 特点 |
|---|---|
| JUL | JavaSE 官方日志框架,配置简单但不够灵活,性能较差 |
| 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")@RestControllerpublic 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,应统一使用日志框架
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
评论区
[ 标签 ]
[ 分类 ]
[ 公告 ]
如果你喜欢,那么欢迎来到我的世界!
了解更多[ 音乐 ]
找不到相关结果。
[ contents ]
[ 全部文章 ]