日志基础与采集原理:日志级别、格式规范与常见框架

说实话,日志这东西,很多团队一开始都不当回事。

我见过太多项目了——日志随便打,级别乱用,格式随心所欲。等到线上出问题,翻日志就像大海捞针。嗯,那时候才后悔,当初怎么不好好设计日志体系。

今天咱们就把日志的底子打扎实。从级别、格式到框架原理,一条条捋清楚。

一、日志级别:你的“信号灯”用对了吗?

日志级别,说白了就是给每条日志贴个标签。告诉看日志的人:这条消息有多重要。

我个人习惯把日志级别比作交通信号灯:

  • DEBUG(绿灯)—— 开发调试用,线上环境一般关掉。信息量最大,也最啰嗦。
  • INFO(黄灯)—— 记录系统正常运行的关键节点。比如“用户登录成功”、“订单已创建”。
  • WARN(橙色灯)—— 有潜在风险,但系统还能扛。比如“磁盘使用率超过80%”。
  • ERROR(红灯)—— 出问题了,需要人工介入。比如“数据库连接失败”、“支付接口超时”。

我在项目中遇到过一件事:有个同事把所有日志都打成了ERROR级别。结果线上告警天天响,大家反而麻木了。真正出大问题时,反而没人注意到。

⚠️ 避坑指南
我曾经接手过一个项目,DEBUG日志里打印了用户的明文密码。幸好只在测试环境。记住:永远不要在日志里输出敏感信息(密码、身份证、银行卡号)。

二、日志格式规范:统一就是生产力

你想想看,如果每个模块的日志格式都不一样——有的用逗号分隔,有的用竖线,有的连时间戳都没有。那日志分析工具根本没法用。

我建议团队统一采用以下格式:

[时间戳] [日志级别] [线程名] [类名:行号] - 日志内容

举个例子:

[2025-03-15 14:30:22.123] [INFO] [http-nio-8080-exec-1] [com.example.OrderService:56] - 订单创建成功,订单号:ORD20250315001

为什么这么设计?

  • 时间戳:精确到毫秒,方便排查时序问题
  • 日志级别:一眼看出严重程度
  • 线程名:多线程环境下,知道是哪个线程在干活
  • 类名:行号:快速定位代码位置
💡 小技巧
我个人习惯在日志格式里加上traceId。这样一次请求的所有日志都能串起来。排查问题时,按traceId一搜,整个调用链就出来了。

三、常见日志框架原理:Log4j vs Logback

说到日志框架,Java生态里绕不开两个名字:Log4j和Logback。其实Logback就是Log4j的升级版,同一个作者写的。

3.1 Log4j 原理

Log4j的核心组件就三个:

  • Logger:负责产生日志
  • Appender:负责输出日志(控制台、文件、数据库等)
  • Layout:负责格式化日志内容

它们的关系很简单:Logger产生日志 → 交给Appender → Appender用Layout格式化后输出。

下面这张图能帮你快速理解:

Logger 产生日志 Appender 输出日志 Layout 格式化内容 Log4j 核心工作流程 控制台 文件 数据库 远程服务器

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天。日志格式就是咱们前面说的那种。

📌 重点总结
  1. 日志级别:DEBUG < INFO < WARN < ERROR,线上一般开INFO及以上
  2. 日志格式:统一规范,包含时间、级别、线程、类名、内容
  3. 框架原理:Logger → Appender → Layout,三层架构
  4. Logback是Log4j的升级版,性能更好,功能更强

好了,日志的基础就这些。说白了,日志就是系统的“黑匣子”。你把它设计好了,排查问题就像看监控回放一样清晰。设计不好,那就是一堆乱码。

下一节咱们聊聊怎么用代码采集这些日志,以及怎么把它们送到统一的监控平台去。


专注资料整理