手把手教会你 Linux 的日志分析命令(附 Java + Spring Boot 实战案例)
·
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!
一、为什么需要日志分析?
在开发和运维中,日志是系统的眼睛。当你的 Spring Boot 应用部署到 Linux 服务器上后,如果出现异常、性能问题或安全事件,日志文件就是你排查问题的第一手资料。
但面对动辄上 GB 的日志文件,直接 cat 或 vim 查看显然不现实。这时候,Linux 提供了一套高效、灵活的日志分析命令组合,能帮你快速定位问题。
二、常见日志位置(Spring Boot 默认)
Spring Boot 默认使用 Logback 作为日志框架。如果你没有自定义日志路径,日志通常输出到:
# 控制台(开发环境)
# 或
nohup java -jar app.jar > app.log 2>&1 &
生产环境中,建议配置 logback-spring.xml 将日志写入文件,例如:
<!-- src/main/resources/logback-spring.xml -->
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/myapp/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/var/log/myapp/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
这样日志会写入 /var/log/myapp/app.log,并按天/大小滚动。
三、核心日志分析命令(手把手教学)
✅ 1. tail:实时查看最新日志(最常用!)
# 查看最后 100 行
tail -n 100 /var/log/myapp/app.log
# 实时追踪日志(Ctrl+C 退出)
tail -f /var/log/myapp/app.log
场景:应用刚上线,你想看看有没有报错。
✅ 2. grep:过滤关键词(排查错误神器)
# 查找所有 ERROR 日志
grep "ERROR" /var/log/myapp/app.log
# 忽略大小写(比如 error / Error)
grep -i "error" /var/log/myapp/app.log
# 显示匹配行的前后各 3 行(上下文)
grep -C 3 "NullPointerException" /var/log/myapp/app.log
# 只显示包含 "OrderService" 且包含 "timeout" 的行
grep "OrderService" /var/log/myapp/app.log | grep "timeout"
场景:用户反馈下单失败,你怀疑是 OrderService 超时。
✅ 3. awk:提取特定字段(结构化日志利器)
假设日志格式为:
2026-01-09 14:30:22 [http-nio-8080-exec-1] ERROR com.example.service.UserService - User not found: id=123
你想提取所有“User not found”的用户 ID:
grep "User not found" /var/log/myapp/app.log | awk -F 'id=' '{print $2}'
# 输出:123
或者提取时间 + 错误级别:
awk '{print $1, $2, $4}' /var/log/myapp/app.log | head -5
# 输出:
# 2026-01-09 14:30:22 ERROR
# 2026-01-09 14:31:05 INFO
场景:统计某类错误发生的频率或关联用户 ID。
✅ 4. wc + sort + uniq:统计高频错误
# 统计 ERROR 行数
grep "ERROR" /var/log/myapp/app.log | wc -l
# 统计各类异常出现次数(假设异常名在第7列)
awk '/ERROR/ {print $7}' /var/log/myapp/app.log | sort | uniq -c | sort -nr
输出示例:
45 NullPointerException
12 IllegalArgumentException
3 IOException
场景:快速发现系统中最常见的异常类型。
✅ 5. less:分页查看大文件(比 vim 更快)
less /var/log/myapp/app.log
# 操作:
# 空格 → 下一页
# b → 上一页
# /keyword → 搜索关键词
# q → 退出
场景:日志太大,不能一次性加载进内存。
四、反例 & 注意事项(新手常踩的坑)
❌ 反例1:直接用 cat 查看大日志
cat /var/log/myapp/app.log # 如果日志 5GB,终端会卡死!
✅ 正确做法:用 less 或 tail -n 1000。
❌ 反例2:忽略日志轮转(log rotation)
如果你的日志每天滚动,只查 app.log 会漏掉历史数据。
# 错误
grep "ERROR" /var/log/myapp/app.log
# 正确:查所有日志文件
grep "ERROR" /var/log/myapp/app*.log
# 或使用 zgrep 查看压缩日志(如果启用了 gzip)
zgrep "ERROR" /var/log/myapp/app.log.2026-01-08.gz
❌ 反例3:正则写错导致漏匹配
# 错误:没转义特殊字符
grep "user[id]" log.txt # [] 是正则元字符!
# 正确:
grep "user\[id\]" log.txt
# 或用 fgrep(纯字符串匹配)
fgrep "user[id]" log.txt
⚠️ 注意事项:
- 权限问题:普通用户可能无法读取
/var/log/下的日志,用sudo或加入adm用户组。 - 日志格式统一:建议使用 JSON 格式日志(如 LogstashEncoder),便于后续用
jq解析。 - 不要在生产环境频繁
grep大文件:会影响 I/O 性能,可先cp到临时目录再分析。
五、Java + Spring Boot 实战:模拟日志并分析
1. 创建一个会抛异常的 Controller
@RestController
public class TestController {
private static final Logger log = LoggerFactory.getLogger(TestController.class);
@GetMapping("/test-error")
public String testError(@RequestParam(defaultValue = "0") int userId) {
if (userId <= 0) {
log.error("Invalid user id: {}", userId);
throw new IllegalArgumentException("User ID must be positive");
}
log.info("Processing user: {}", userId);
return "OK";
}
}
2. 启动应用并制造错误
curl "http://localhost:8080/test-error?userId=-1"
curl "http://localhost:8080/test-error?userId=100"
3. 分析日志
# 查看所有错误
grep "ERROR" /var/log/myapp/app.log
# 提取非法用户ID
grep "Invalid user id" /var/log/myapp/app.log | awk -F '{}' '{print $2}' | tr -d ' '
# 输出:-1
六、总结
| 命令 | 用途 |
|---|---|
tail -f |
实时监控日志 |
grep |
关键词过滤 |
awk |
字段提取 |
sort/uniq |
统计去重 |
less |
安全查看大文件 |
掌握这些命令,你就能在 Linux 服务器上像老司机一样快速定位问题,不再被海量日志吓倒!
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!
更多推荐

所有评论(0)