日志基础与采集原理:日志级别、格式规范与常见框架
说实话,日志这东西,很多团队一开始都不当回事。
我见过太多项目了——日志随便打,级别乱用,格式随心所欲。等到线上出问题,翻日志就像大海捞针。嗯,那时候才后悔,当初怎么不好好设计日志体系。
今天咱们就把日志的底子打扎实。从级别、格式到框架原理,一条条捋清楚。
一、日志级别:你的“信号灯”用对了吗?
日志级别,说白了就是给每条日志贴个标签。告诉看日志的人:这条消息有多重要。
我个人习惯把日志级别比作交通信号灯:
- DEBUG(绿灯)—— 开发调试用,线上环境一般关掉。信息量最大,也最啰嗦。
- INFO(黄灯)—— 记录系统正常运行的关键节点。比如“用户登录成功”、“订单已创建”。
- WARN(橙色灯)—— 有潜在风险,但系统还能扛。比如“磁盘使用率超过80%”。
- ERROR(红灯)—— 出问题了,需要人工介入。比如“数据库连接失败”、“支付接口超时”。
我在项目中遇到过一件事:有个同事把所有日志都打成了ERROR级别。结果线上告警天天响,大家反而麻木了。真正出大问题时,反而没人注意到。
⚠️ 避坑指南
我曾经接手过一个项目,DEBUG日志里打印了用户的明文密码。幸好只在测试环境。记住:永远不要在日志里输出敏感信息(密码、身份证、银行卡号)。
我曾经接手过一个项目,DEBUG日志里打印了用户的明文密码。幸好只在测试环境。记住:永远不要在日志里输出敏感信息(密码、身份证、银行卡号)。
二、日志格式规范:统一就是生产力
你想想看,如果每个模块的日志格式都不一样——有的用逗号分隔,有的用竖线,有的连时间戳都没有。那日志分析工具根本没法用。
我建议团队统一采用以下格式:
[时间戳] [日志级别] [线程名] [类名:行号] - 日志内容
举个例子:
[2025-03-15 14:30:22.123] [INFO] [http-nio-8080-exec-1] [com.example.OrderService:56] - 订单创建成功,订单号:ORD20250315001
为什么这么设计?
- 时间戳:精确到毫秒,方便排查时序问题
- 日志级别:一眼看出严重程度
- 线程名:多线程环境下,知道是哪个线程在干活
- 类名:行号:快速定位代码位置
💡 小技巧
我个人习惯在日志格式里加上traceId。这样一次请求的所有日志都能串起来。排查问题时,按traceId一搜,整个调用链就出来了。
我个人习惯在日志格式里加上traceId。这样一次请求的所有日志都能串起来。排查问题时,按traceId一搜,整个调用链就出来了。
三、常见日志框架原理:Log4j vs Logback
说到日志框架,Java生态里绕不开两个名字:Log4j和Logback。其实Logback就是Log4j的升级版,同一个作者写的。
3.1 Log4j 原理
Log4j的核心组件就三个:
- Logger:负责产生日志
- Appender:负责输出日志(控制台、文件、数据库等)
- Layout:负责格式化日志内容
它们的关系很简单:Logger产生日志 → 交给Appender → Appender用Layout格式化后输出。
下面这张图能帮你快速理解:
3.2 Logback 原理
Logback和Log4j的架构基本一致。但它做了几个关键优化:
- 性能更好:异步日志的吞吐量比Log4j高很多
- 自动重载:配置文件改了,不用重启应用
- 条件判断:支持if-else配置,不同环境用不同策略
举个例子,Logback的配置文件长这样:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
这段配置的意思是:每天生成一个日志文件,保留30天。日志格式就是咱们前面说的那种。
📌 重点总结
- 日志级别:DEBUG < INFO < WARN < ERROR,线上一般开INFO及以上
- 日志格式:统一规范,包含时间、级别、线程、类名、内容
- 框架原理:Logger → Appender → Layout,三层架构
- Logback是Log4j的升级版,性能更好,功能更强
好了,日志的基础就这些。说白了,日志就是系统的“黑匣子”。你把它设计好了,排查问题就像看监控回放一样清晰。设计不好,那就是一堆乱码。
下一节咱们聊聊怎么用代码采集这些日志,以及怎么把它们送到统一的监控平台去。