日志等级(Log Levels)详解:DEBUG、INFO、WARN、ERROR、FATAL 怎么用

日志等级(Log Levels)是给每条日志标注的严重程度标签,用于控制「什么信息被记录、什么信息被展示、什么信息触发告警」。主流标准分为 DEBUG、INFO、WARN、ERROR、FATAL 五级,严重程度依次递增。 等级体系的核心价值是:日常把噪音压到最低,出问题时又能按等级快速过滤和报警。

五个标准等级速查表

等级 含义 典型内容 生产环境 触发告警
DEBUG 调试细节 变量值、SQL 语句、函数入参 关闭 否
INFO 正常的业务节点 用户登录、订单创建、任务启动 开启 否
WARN 异常但可自动恢复 重试成功、降级触发、慢请求 开启 聚合后人工关注
ERROR 功能失败,影响当前操作 接口 5xx、支付失败、空指针 开启 是
FATAL 系统级不可用 数据库连不上、服务无法启动 开启 是(P0 响应)

每个等级的判断标准

实践中等级误用比缺日志更常见。以下是可执行的判断标准:

DEBUG:给开发者自己看的

  • 判断标准:这条信息在系统正常运行时毫无价值,只在排查具体 Bug 时有用;
  • 典型内容:函数入参出参、中间计算结果、缓存命中情况;
  • 关键原则:生产环境默认关闭。不是删掉,是过滤掉——出问题时能临时打开。

INFO:给「看系统在做什么」的人

  • 判断标准:半年后回看这条日志,能还原出用户的操作轨迹;
  • 典型内容:关键业务动作(注册、下单、发布),任务开始/结束与耗时;
  • 反面例子:把每个 HTTP 200 都打成 INFO——这是访问日志该干的事,不要污染业务日志。

WARN:异常发生了,但系统扛住了

  • 判断标准:需要有人知道,但不需要半夜爬起来;
  • 典型内容:重试后成功、触发限流/降级、请求耗时超过阈值;
  • 风险信号:WARN 数量突增往往是 ERROR 的前兆,应接入趋势监控。

ERROR:用户的某个操作失败了

  • 判断标准:如果不修,用户会再次遇到同样的问题;
  • 典型内容:外部服务调用失败、数据校验异常、未捕获异常(Uncaught Error);
  • 关键要求:每条 ERROR 必须带上下文(URL、用户/租户 ID、请求参数、堆栈),否则只是一条无法行动的噪音。

FATAL:系统已经不可用了

  • 判断标准:服务整体无法继续提供正常服务;
  • 典型内容:数据库连接失败、依赖的配置缺失、启动失败;
  • 实践提示:Web 应用里 FATAL 很少——大多数「系统挂了」表现为成批的 ERROR,用「ERROR 突增告警」覆盖即可,不要滥用 FATAL 稀释严重性。

浏览器 Console 里的日志等级

前端日志等级与后端同名但能力不同。Console 原生支持:
方法 Console 中的等级 用途
console.debug() Debug(默认隐藏,需勾选 Verbose) 开发期调试
console.log() Info 普通输出
console.info() Info 同上,语义化写法
console.warn() Warning,黄色 可恢复异常提示
console.error() Error,红色,带堆栈 失败与未捕获异常
两个实用建议:
  • 前端用 console.debug 而不是 console.log 写调试信息——生产构建会自动被默认过滤器隐藏,不需要手动清理;
  • 未捕获异常(window.onerror / unhandledrejection)默认就是 ERROR 级,是线上排查的第一线索。
  • 前端日志的特殊难题:用户不帮你采集

    后端日志集中在服务端,出了问题随时可查。前端日志却散落在每个用户的浏览器里——用户报「页面坏了」,而 Console 报错和失败请求随着那次页面会话消失了。等用户按教程打开 DevTools(步骤见如何打开浏览器控制台),报错早已被刷新冲掉。 所以前端日志策略要回答的问题不是「等级怎么定」,而是「出错瞬间的日志怎么留存下来」。常见方案:
    方案 原理 代价
    自建上报 全量把 console 输出发回服务端 存储/隐私成本高,采样难定
    前端监控平台 全量采集 + 会话回放 按量计费,中小团队成本高
    按需采集(随 Bug 报告带走) 用户提交反馈时,自动把当时 Console/Network 的报错一并附上 成本最低,覆盖「用户主动报告」这一最大来源
    第三种方案与缺陷报告天然契合:用户报 Bug 的那一刻,正是需要日志的那一刻。 BugCapturer 采用的就是这种按需采集:用户(哪怕完全不懂技术)通过浏览器扩展或页面内嵌 SDK 提交带标注的截图/录屏时,报告自动附带当前的 Console 报错(含 ERROR 堆栈)与 Network 失败请求,以及 URL 和浏览器环境(详见诊断功能)。开发者收到的报告自带 ERROR 级日志上下文,不需要再让用户「打开 F12 复制一下」。报告可生成免登录分享链接,或自动推送进 Slack / Microsoft Teams 频道统一跟踪。

    常见误区

    误区 正确做法
    用 console.log 打一切,上线不清理 分级:调试用 debug,业务节点用 info,构建时压缩 debug
    把失败打成 INFO「以免吓到运维」 失败就是 ERROR,告警靠等级而不是靠人翻日志
    ERROR 不带上下文,只有一条消息 强制附带 URL、参数、堆栈,否则等于没记
    所有日志都开 DEBUG 方便排查 等级是过滤器:平时关 DEBUG,问题发生时再按需打开
    WARN 大量积压无人处理 WARN 接趋势告警,突增即 ERROR 前兆

    FAQ

    Q:log levels 一共有哪几个? A:主流标准是 DEBUG、INFO、WARN、ERROR、FATAL 五级;部分框架(如 Syslog、Trace 系)会有 TRACE/NOTICE/CRITICAL 等变体,但语义与上表一一对应。 Q:logging levels 应该怎么选和配置? A:开发环境全开(DEBUG 起),生产环境 INFO 或 WARN 起;ERROR 级接告警,WARN 级接趋势监控。库与业务代码分开配置,避免依赖库的 DEBUG 刷屏。 Q:前端有必要像后端一样做日志分级吗? A:有必要但可以简化:区分「调试 / 正常 / 警告 / 错误」四级即可,重点保证 ERROR 带堆栈,并解决「出错瞬间日志留存」的问题。 Q:用户报 Bug 时怎么让他把 Console 报错发过来? A:让非技术用户复制报错基本不可行。用 BugCapturer 这类工具在提交反馈时自动抓取 Console/Network 报错,见上文「按需采集」一节。