3、基础目录结构:/var/log/{service}/{env}/{type}/{YYYY}/{MM}/{DD}/ 标准模型解析

日志目录怎么设计?很多人觉得随便建个文件夹就行。但我在企业里踩过坑——日志混在一起,排查问题时像大海捞针。后来我总结出这套模型,说白了就是给日志文件上了个「多维索引」。

先看这个标准路径:

/var/log/{service}/{env}/{type}/{YYYY}/{MM}/{DD}/

嗯,一共五层。每一层都有它的道理。我们一层层拆开看。

3.1 第一层:{service} —— 服务隔离

为什么第一层是服务名?你想想看,一个企业里少说几十个服务。如果所有日志堆在一起,光找文件就能让你崩溃。

我建议用服务名做顶层目录。比如:

  • /var/log/nginx/
  • /var/log/mysql/
  • /var/log/api-gateway/
  • /var/log/user-service/

这样做的好处很明显:

  • 权限控制方便 —— 每个服务只读写自己的目录
  • 磁盘隔离 —— 可以针对单个服务做磁盘配额
  • 运维清晰 —— 哪个服务出问题,直接进对应目录
我的习惯:服务名统一用小写字母加连字符。比如 user-service,不要用 UserService 或 user_service。Linux 系统对大小写敏感,统一风格能避免很多低级错误。

3.2 第二层:{env} —— 环境区分

第二层放环境标识。我在项目中遇到过,有人把开发环境和生产环境的日志混在一起。结果半夜排查生产故障,翻出来的全是测试数据……那场面,别提多尴尬了。

标准的环境分类:

环境标识 说明 典型用途
prod 生产环境 线上真实流量,需要长期保留
staging 预发布环境 上线前最后验证,保留周期较短
test 测试环境 自动化测试、集成测试日志
dev 开发环境 开发人员本地调试,通常不集中采集
我曾经踩过的坑:有个团队用 dev、test、prod 三个环境,但测试环境日志量特别大,把磁盘撑爆了,导致生产日志写不进去。后来我强制要求每个环境挂载独立磁盘分区,才彻底解决这个问题。

3.3 第三层:{type} —— 日志类型

第三层按日志类型划分。一个服务会输出多种日志,混在一起根本没法用。

常见的日志类型:

  • access —— 访问日志,记录每次请求
  • error —— 错误日志,记录异常和报错
  • audit —— 审计日志,记录操作行为
  • slow —— 慢查询日志,记录性能瓶颈
  • debug —— 调试日志,开发阶段使用

举个例子,Nginx 的日志目录结构:

/var/log/nginx/prod/access/2025/03/21/
/var/log/nginx/prod/error/2025/03/21/
/var/log/nginx/staging/access/2025/03/21/

这样设计,你想查生产环境 Nginx 今天的错误日志,直接进 /var/log/nginx/prod/error/2025/03/21/,一秒定位。

3.4 第四到六层:{YYYY}/{MM}/{DD} —— 时间分区

最后三层是年、月、日。为什么拆成三层而不是一层?

我刚开始做日志系统时,也想过用 20250321 这种单层目录。但后来发现,时间长了目录里文件太多,ls 命令都卡。而且做日志清理时,按月份删除非常麻烦。

拆成三层的好处:

  • 目录扁平 —— 每个目录下最多 31 个文件
  • 清理方便 —— 想删某个月的数据,直接 rm -rf /var/log/nginx/prod/access/2025/03/
  • 归档灵活 —— 可以按年、按月、按天做不同策略
核心原则:时间分区是日志目录的「时间轴索引」。它让海量日志从无序变成有序,从线性变成树形。没有这个分层,日志管理就是一团乱麻。

3.5 完整示例:一个真实的日志目录

来看一个完整的例子。假设我们有个电商系统,包含订单服务和支付服务。生产环境的访问日志目录结构:

/var/log/
├── order-service/
│   ├── prod/
│   │   ├── access/
│   │   │   └── 2025/
│   │   │       └── 03/
│   │   │           ├── 21/
│   │   │           │   ├── access.log
│   │   │           │   └── access.log.gz
│   │   │           └── 22/
│   │   │               └── access.log
│   │   ├── error/
│   │   │   └── 2025/
│   │   │       └── 03/
│   │   │           └── 21/
│   │   │               └── error.log
│   │   └── slow/
│   │       └── 2025/
│   │           └── 03/
│   │               └── 21/
│   │                   └── slow_query.log
│   └── staging/
│       └── access/
│           └── 2025/
│               └── 03/
│                   └── 21/
│                       └── access.log
└── payment-service/
    └── prod/
        └── access/
            └── 2025/
                └── 03/
                    └── 21/
                        └── access.log

看到没?这个结构天然支持按服务、按环境、按类型、按时间做任意维度的查询。你可以在 5 秒内定位到任何一条日志。

3.6 核心逻辑:为什么是这五层?

这五层不是随便定的。我画了张图,帮你理解它们的关系:

日志目录五层模型:多维索引体系 服务 {service} 环境 {env} 类型 {type} 年 {YYYY} 月 {MM} 说明: 每一层都是一个独立的索引维度。查询日志时,你可以按任意维度组合过滤,比如「生产环境 Nginx 昨天的错误日志」。 日 {DD} 继续细分 完整路径:/var/log/{service}/{env}/{type}/{YYYY}/{MM}/{DD}/

这张图想表达的核心思想:五层目录 = 五个索引维度。服务、环境、类型是「业务维度」,年、月、日是「时间维度」。两者组合,构成了一个完整的日志索引体系。

3.7 避坑指南:常见错误

我见过不少团队在这个模型上翻车。总结几个常见问题:

  1. 层级顺序搞反 —— 有人把时间放前面,服务放后面。结果想查某个服务的所有日志,得遍历所有时间目录,性能极差。
  2. 环境标识不统一 —— 有人用 production,有人用 prod,还有人用 prd。统一规范比什么都重要。
  3. 日志类型太粗 —— 所有日志都扔进 general 目录,等于没分类。我建议至少分出 access、error、audit 三类。
  4. 时间分区不完整 —— 只按天分区,没有年、月。一年后目录里 365 个文件夹,管理起来很痛苦。
我曾经犯过的错:有个项目我偷懒,把环境层去掉了,觉得「反正就一个环境」。结果半年后业务扩张,需要区分国内和海外环境,所有日志目录都得重构。那次教训让我明白——设计时多留一层,比事后重构划算得多。

3.8 小结:记住三个要点

这套目录模型,你只需要记住三点:

  • 业务维度在前 —— 服务 > 环境 > 类型,从大到小排列
  • 时间维度在后 —— 年 > 月 > 日,从粗到细拆分
  • 保持一致性 —— 所有服务、所有环境都遵循同一套规则

做到这三点,你的日志目录就已经具备了企业级的基础。后面章节我们会在这个基础上,加上日志轮转、压缩、清理策略,让它真正能支撑大规模生产环境。