视频看了几百小时还迷糊?关注我,几分钟让你秒懂!


一、为什么需要日志分析?

在开发和运维中,日志是系统的眼睛。当你的 Spring Boot 应用部署到 Linux 服务器上后,如果出现异常、性能问题或安全事件,日志文件就是你排查问题的第一手资料。

但面对动辄上 GB 的日志文件,直接 catvim 查看显然不现实。这时候,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,终端会卡死!

✅ 正确做法:用 lesstail -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

⚠️ 注意事项:

  1. 权限问题:普通用户可能无法读取 /var/log/ 下的日志,用 sudo 或加入 adm 用户组。
  2. 日志格式统一:建议使用 JSON 格式日志(如 LogstashEncoder),便于后续用 jq 解析。
  3. 不要在生产环境频繁 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 服务器上像老司机一样快速定位问题,不再被海量日志吓倒!


视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐