一、日志基础概念

1.1 日志到底是什么

说到日志,我先问个问题:你运维过一台不记录任何日志的服务器吗?
别说,我还真见过一次。那是一个内部工具,开发图省事把日志全关了。结果线上出故障,谁都查不出原因。
最后用了一整天才定位到——一个NullPointerException。从那以后,我对日志的态度就变成了:宁可多记,不可少记。

我个人习惯把日志定义为:
系统在运行过程中产生的、带有时间戳的结构化或非结构化记录。

说白了,它就是系统的一个“黑匣子”。你翻看它,就能知道发生了什么、什么时候发生、在哪里发生。

举个例子:

2025-03-17 14:32:18 ERROR [UserService:45] org.springframework.dao.DuplicateKeyException: 
Duplicate entry 'admin' for key 'username_idx'

这行日志告诉你三件事:

  • 时间点:14点32分18秒
  • 报错模块:UserService第45行
  • 原因:插入了重复的用户名 admin

你想想看,如果没有这行日志,运维得多头疼?

1.2 日志的作用——不只是“找bug”

很多新人对日志的理解就是“出错了看日志”。其实远不止这些。我把日志的作用总结为四类:

作用维度 具体说明 我的亲身经历
故障排查 快速定位错误、异常、死锁、内存泄漏等 有一次线上数据库连接池耗尽,全靠应用日志里的连接创建/释放记录找到问题
性能分析 通过请求耗时、SQL慢查询等日志发现瓶颈 我用 Nginx 访问日志结合上下游耗时,发现第三方接口超时影响了 30% 的请求
安全审计 记录登录、授权、敏感操作,用于事后追溯 某次合规检查,安全日志帮我们证明了没有越权访问
业务运营 分析用户行为、订单转化、接口调用量 电商大促时,业务日志里的下单流水帮我们实时评估促销效果
小技巧: 我个人每部署一个服务,都会提前约定好“核心日志路径”。比如统一把错误日志写到 /var/log/app/error/,方便集中排查。否则日志散了,定位问题像大海捞针。

1.3 日志的主流分类

工作中最常见的三大日志类型:系统日志、应用日志、安全日志。它们关注点不同,但相互配合才能构成完整的可观测体系。

类型 来源 典型内容 我踩过的坑
系统日志 操作系统、中间件、基础设施层 /var/log/messages, syslog, 内核日志, Nginx access log 我曾经只看应用日志,忽视系统日志,结果磁盘满了导致服务挂掉,应用日志却什么也没写
应用日志 业务代码、框架、数据库连接池等 请求入参出参、异常堆栈、业务状态变更 有一次应用日志级别设置错误(只打印 ERROR),导致排查问题时没有 INFO 级上下文,前后拼凑了很久
安全日志 认证授权模块、WAF、入侵检测等 登录成功/失败记录、权限变更、敏感操作审计 合规审计时发现安全日志缺少操作人IP,差点被罚。从那以后我强制要求每一条安全日志必须有源IP

你可能会问:这三类日志怎么配合使用?我分享一个真实场景:

某次线上故障,应用日志显示“数据库连接超时”,但数据库本身监控正常。我翻看系统日志,发现当时有一次iptables 规则变更,临时拦截了应用服务器的出站流量。而安全日志记录了这次变更操作是由运维人员执行脚本引起的。三份日志合并才拼出完整真相。

注意: 千万不要只存储一类日志。
我见过不少团队只保留应用日志,遇到安全审计或底层故障时完全懵了。好的做法是三类日志都保留,且同步到统一的日志中心。

1.4 三类日志的关系——一张图说清楚

下面我用一张结构图展示系统日志、应用日志、安全日志之间的层级与交互关系。这是我自己在技术分享时常用的一种画法。

日志分类与关系框架图 日志分类 系统日志 操作系统 | 中间件 | 基础设施 应用日志 业务代码 | 数据库 | 框架 安全日志 认证 | WAF | 审计 内核、syslog、磁盘IO 请求日志、错误栈、SQL 登录记录、权限变更、IP 三类日志互相补充,共同构成可观测性体系

1.5 日志分类的避坑指南

看完了理论,我来分享几个实战中经常踩的坑,希望对你有帮助。

  • 日志混在一起不分目录: 我曾接手一个老项目,所有日志都写到同一个文件里。系统日志、应用日志、访问日志搅成一锅粥。排查问题时 grep 半天,效率极低。现在我的习惯是:/var/log/{app-name}/{type}/ 这样分目录存放。
  • 安全日志被忽视: 很多团队前期不重视安全日志,等到被审计追问时才补。“缺了谁登录、谁删了什么”这种信息,事后根本补不回来。我建议至少记录:登录结果、敏感操作、配置变更。
  • 错误日志不包含上下文: 只打印 ERROR: null pointer 等于没日志。我要求团队在错误日志中必须带上请求ID、用户ID、操作接口、完整堆栈。
核心建议: 三类日志要同源、同时、同格式。所谓“同源”就是所有日志都通过统一日志框架(如 Logback、Log4j2)输出;“同时”指时钟必须 NTP 同步,否则跨系统关联时时间错乱极难排查;“同格式”则能让日志解析和搜索变得更高效。

1.6 日志级别与合规基础

虽然不是本章重点,但我想提一句:日志级别(TRACE/DEBUG/INFO/WARN/ERROR)不仅仅是开发习惯,还涉及合规成本。你在生产环境开 DEBUG 日志,日志量会飙升几十倍,存储成本、检索性能都会出问题。

我记得在某次大促前,一个同事把日志级别从 INFO 改成了 DEBUG,结果一天产生了200GB日志,把监控集群的磁盘写满了。从那以后我定了一条铁律:生产环境默认 INFO;排查问题时单独调整指定模块,用完立刻恢复。

好了,日志的基础概念就讲到这里。理解这些分类和关系,是后面学习日志规范、合规要求的前提。你可以对照自己手头的项目,检查一下三类日志有没有都保存好、分目录了吗、格式统一吗?这些琐碎的“小事”恰恰是后期省大事的关键。