2. 日志基础:日志格式、级别、常见日志系统归纳总结

日志这个东西,说白了就是程序运行时的“黑匣子”。我刚开始做运维的时候,觉得日志就是用来查 bug 的,直到有一次线上告警风暴,几千条错误日志刷屏,我才意识到——日志格式、级别、采集方式,任何一个环节没设计好,后面全得翻车。

这一节我们就把日志的底层逻辑拆开看看。你搞清楚这三个东西,后续的告警阈值设计和巡检优化才有了“原材料”。

2.1 日志格式——别让解析器猜谜

日志的格式决定了你能从日志里提取什么信息。我习惯把格式分为两类:结构化日志和非结构化日志。

对比维度结构化日志非结构化日志
典型格式JSON / MessagePack / Protocol Buffers纯文本 / CSV / 固定分隔
解析难度低(字段直接索引)高(需要正则/模板切割)
存储开销略大(含字段名冗余)较小(仅文本)
排查效率高(可精确过滤字段)低(全文检索为主)
适配告警阈值直接提取数值字段需额外解析提取
我的建议:新项目一律用 JSON 格式日志。我在一次微服务改造中吃过亏——业务方要求保留旧格式,结果日志采集后解析 CPU 飙升 30%。JSON 虽然占点磁盘,但解析成本低太多了。

一个标准的结构化日志示例(JSON)长这样:

{
  "timestamp": "2025-02-08T14:23:11.897Z",
  "level": "WARN",
  "logger": "com.example.payment.PaymentService",
  "message": "支付接口响应超时",
  "fields": {
    "order_id": "ORD20250208142311",
    "cost_ms": 3200,
    "retry_count": 2
  }
}

你想想看,如果cost_ms字段能直接拿来算大盘接口耗时 P99,告警阈值直接对字段做规则,多清晰?非结构化文本你得先写正则抠数字,性能又差维护又烦。

2.2 日志级别——学会分级,别什么都打 ERROR

级别是日志的“优先级标签”。我见过最多的坑是:开发同学把所有异常都打 ERROR,结果 ERROR 日志一天几万条,真正需要人工介入的问题反而被淹没了。

常见的级别体系(Java / Log4j2 / SLF4J)如下:

级别数值含义告警阈值适用场景
TRACE600最细粒度的追踪信息一般不参与告警,用于调试
DEBUG500开发调试信息生产环境应关闭
INFO400关键业务节点记录(如订单创建成功)可监控业务流量异常(如 INFO 突然降为零)
WARN300潜在风险但仍可继续运行(如重试、降级触发)控制 WARN 的突发频率,防止告警轰炸
ERROR200功能不可用或异常,需人工关注最常用的告警级别,设置阈值 + 持续时间
FATAL100严重故障,进程可能退出建议直接电话告警,阈值设为>0
避坑指南:我曾经遇到一个项目,开发在 catch 块里直接log.error("发生异常", e);捕获业务校验异常(如参数不合法),导致 ERROR 日志量是真正系统异常的 10 倍。正确的做法是:业务逻辑异常用 WARN 记录,系统级异常再用 ERROR。这样告警阈值才能区分“需要修复”和“只是需要关注”。

2.3 常见日志系统——选型也是告警设计的一部分

日志系统处理“日志产生→采集→传输→存储→查询→告警”全链路。我梳理了几个主流方案的特征:

系统/栈典型组件核心优势阈值优化关注点
ELK StackFilebeat + Logstash + Elasticsearch + Kibana全文检索强大,Kibana 可视化成熟ES 写入压力大时,日志级过滤前置到 Filebeat/Logstash
Loki + Promtail + GrafanaPromtail / Grafana Alloy / Loki / Grafana低成本,与 Prometheus 生态统一标签(labels)设计直接影响阈值告警效率
EFK(云原生变体)Fluentd / Fluent Bit + Elasticsearch / OpenSearchFluentd 插件丰富,适合容器化场景Fluentd 的 buffer/retry 配置影响日志丢失率
阿里云 SLS / 腾讯云 CLS托管版采集 + 存储 + 告警免运维,自带告警规则引擎注意配额和成本,阈值建议设置“触发后冷却时间”
SigNoz / Grafana Cloud开源 APM + 日志一体化支持 tracing + logs 关联利用 trace_id 将慢调用与错误日志关联,精准降噪

你可能会问:这些系统对告警阈值设计有啥直接影响?我举个例子——用 ELK 的 Watcher,你可以写一个查询“按 logger 分组统计 5 分钟内的 ERROR 数量”,如果某组超过 10 次就触发告警。但如果你日志级别没定义好,或者格式里没有 logger 字段,这个规则根本写不出来。

核心结论:日志格式 → 决定了你能“过滤/聚合”什么字段;日志级别 → 决定了你的告警信号是“真问题”还是“假警报”;日志系统 → 决定了你实现阈值规则的成本和灵活性。这三层依次决定告警设计的“原料质量”。

最后看一下我们这一节的知识地图:

日志体系基础结构(第2章) 应用程序 日志框架(Log4j2/Logback) 日志格式(JSON/Plain) 日志级别(DEBUG~FATAL) 日志系统(ELK/Loki等) 存储 + 阈规则引擎 关键原则 1. 格式定字段 2. 级别定信号质量 3. 系统定实现成本

嗯,到这里你应该明白了——日志基础不是孤立的知识,它直接决定了你后面设计告警阈值时“有什么可用的”、“能不能自动化”。下一层我们再具体讲如何基于这些基础做巡检优化,但今天先把这三个要素刻进脑子里。