本文目录导读:

开源日志分级通常遵循 “严重性递增” 的原则,从最详细的诊断信息到最严重的系统崩溃,最广泛采用的模型是基于 Syslog 或 Log4j 的标准,一般分为以下几个级别(从低到高):
标准分级层级
以下是业界最通用的6个级别(以及额外的OFF/FATAL):
| 级别 | 名称 | 数值 | 典型用途 | 示例 |
|---|---|---|---|---|
| TRACE | 追踪 | 0 (最低) | 极度详细的调试信息,仅用于开发环境或临时诊断。 | 方法入口、变量值变化、SQL预编译参数。 |
| DEBUG | 调试 | 1 | 开发人员诊断问题。 | 请求处理流程、数据库查询、API调用参数。 |
| INFO | 信息 | 2 | 关键的业务运行状态,用于监控系统健康状况。 | 服务启动成功、用户登录、定时任务开始/结束。 |
| WARN | 警告 | 3 | 潜在的问题或不推荐的行为,系统可正常运行但不完美。 | 磁盘空间不足(未达阈值)、配置过时、API被废弃、重试操作。 |
| ERROR | 错误 | 4 | 非致命的错误,需要关注,功能失败,但系统整体可用。 | 数据库连接失败、文件读写异常、用户请求处理失败。 |
| FATAL | 致命 | 5 (最高) | 极其严重的错误,系统可能即将崩溃或无法继续运行。 | 内存溢出、关键服务不可用、配置文件损坏。 |
- OFF:特殊级别,用于完全关闭日志输出,不属于实际记录级别。
常见的日志框架与对应关系
不同的开源日志库可能有细微的名称差异,但概念一致:
| 框架 / 语言 | 低级 -> 高级 |
|---|---|
| Log4j / SLF4J (Java) | TRACE -> DEBUG -> INFO -> WARN -> ERROR -> FATAL |
| Logback (Java) | TRACE -> DEBUG -> INFO -> WARN -> ERROR |
| Python logging | DEBUG -> INFO -> WARNING -> ERROR -> CRITICAL |
Rust log crate |
TRACE -> DEBUG -> INFO -> WARN -> ERROR |
Go logrus |
Trace -> Debug -> Info -> Warn -> Error -> Fatal -> Panic |
| Ruby Logger | DEBUG -> INFO -> WARN -> ERROR -> FATAL |
生产环境与开发环境的最佳实践
日志分级最重要的应用是 “按环境动态配置输出级别”。
- 开发环境: 设置为 TRACE 或 DEBUG,尽可能多输出,排查问题。
- 测试环境: 设置为 INFO 或 DEBUG,当测试失败时,可临时降低到TRACE。
- 生产环境: 强烈建议设置为 INFO,仅在排查特定线上问题时临时调整为 DEBUG(需谨慎)。
- 不要在生产环境开启 TRACE 或 DEBUG,这会导致:
- 性能暴跌:大量I/O操作拖垮CPU。
- 磁盘爆炸:日志文件飞速增长,填满磁盘。
- 噪音过多:淹没真正关键的ERROR/WARN信息。
- 不要在生产环境开启 TRACE 或 DEBUG,这会导致:
如何合理设置(核心原则)
-
不要随意使用级别:
- 只用
INFO记录业务事件,不要用INFO打印变量值(调试)。 - 只用
ERROR记录需要人工介入的策略性问题,用户输入错误、网络超时(若已重试成功)不应是ERROR,而是WARN。
- 只用
-
按模块/包动态配置: 优秀的日志框架支持按包(Package)或命名空间设置不同级别。
# 全局级别为 INFO rootLogger.level = INFO # 但对自己正在开发的模块开启 DEBUG logger.com.mycompany.payment.service.level = DEBUG # 对某些烦人的第三方库,只显示 WARN 以上 logger.org.apache.http.level = WARN
-
错误处理中的日志:
- 在Catch块中:当捕获到异常时,只打印一次
ERROR日志(带上异常栈),不要在上下级层层打印。 - 区分业务异常与系统错误:用户密码错误(
WARN);数据库连接失败(ERROR)。
- 在Catch块中:当捕获到异常时,只打印一次
-
避免日志污染:
- 不要用
System.out.println()或print()代替日志框架。 - 不要在生产环境打印
TRACE级别的循环内日志(for循环里每读一行打印一次)。
- 不要用
一个实际项目的配置示例
假设你有一个Java项目,使用Logback,生产环境的配置可以这样:
<!-- 生产环境推荐配置 -->
<root level="INFO">
<appender-ref ref="FILE" />
<appender-ref ref="CONSOLE" />
</root>
<!-- 对关键的支付模块,打开更详细的日志,但只在需要时更改为DEBUG -->
<logger name="com.mycompany.payment" level="INFO" />
<!-- 对第三方客户端库,只显示警告及以上,减少噪音 -->
<logger name="org.apache.kafka" level="WARN" />
<!-- 对自己的核心业务代码,可以按需设置 -->
<logger name="com.mycompany.service" level="INFO" />
最核心的一句话:生产环境默认用 INFO,只记录“发生了什么业务事件”和“出了什么不可原谅的错误”;所有调试细节请使用 DEBUG 或 TRACE,并仅在开发或临时排查时启用。