3. 日志文件定位:系统日志路径、应用日志路径与轮转机制

日志文件在哪?这问题听起来简单,但真上手排查时,很多人第一反应是懵的。我记得刚带团队时,有个同事盯着服务器看了十分钟,然后问我:“老师,日志到底存哪个目录?”

嗯,今天我们就彻底把这事说清楚。日志文件定位,说白了就是三件事:系统日志放哪、应用日志放哪、日志满了怎么办。

3.1 系统日志路径:/var/log 的秘密

几乎所有 Linux 发行版,系统日志都集中在 /var/log 下。这不是巧合,这是 FHS(文件系统层次结构标准)规定的。我个人习惯,排查问题时第一件事就是 cd /var/log && ls -lh,先看看有哪些日志文件。

日志文件 用途 常见问题
messages 通用系统日志,记录内核、服务、认证等 磁盘故障、服务崩溃
syslog 与 messages 类似,部分发行版专用 网络配置错误
secure 认证与安全日志(SSH、sudo) 暴力破解、权限异常
dmesg 内核环缓冲区日志(硬件、驱动) 磁盘 I/O 错误、内存故障
cron 计划任务执行日志 任务未执行、脚本报错
boot.log 系统启动过程日志 启动卡住、服务启动失败
maillog / mail.log 邮件服务日志(postfix、sendmail) 邮件投递失败、垃圾邮件
小技巧: 用 tail -f /var/log/messages 实时监控系统日志。我曾经靠这个命令,在五分钟内定位到一台服务器频繁重启的原因——内存条坏了。

这里有个坑要注意。不同发行版,日志文件名可能不一样。比如 CentOS 用 messages,Ubuntu 用 syslog。你想想看,如果拿着 CentOS 的经验去查 Ubuntu,找不到 messages 文件,是不是就慌了?

避坑指南: 我曾经在 Ubuntu 上找了半小时 /var/log/messages,最后发现它叫 syslog。建议先执行 ls /var/log 看一眼,别凭记忆硬找。

3.2 应用日志路径:没有标准就是标准

系统日志有标准路径,但应用日志就自由多了。说白了,每个开发者都有自己的想法。我见过把日志写在 /tmp 的,也见过写在 /opt/app/logs 的,甚至还有直接写数据库的。

不过,还是有规律可循的。常见的应用日志路径大概分这几类:

  • Web 服务器: /var/log/nginx/、/var/log/httpd/、/var/log/apache2/
  • 数据库: /var/log/mysql/、/var/log/postgresql/、/var/log/mongodb/
  • Java 应用: 通常在应用部署目录下的 logs/ 或 log/ 文件夹
  • Docker 容器: 默认通过 docker logs 查看,实际文件在 /var/lib/docker/containers/ 下
  • 自定义应用: 看配置文件,比如 log4j.properties、logging.conf、application.yml
核心原则: 找不到应用日志时,先查配置文件。我一般用 grep -r "log" /etc/app/ 或者 find / -name "*.log" 2>/dev/null 来定位。

举个例子。有一次线上告警,说支付服务响应超时。我登录服务器,先看 /var/log/messages,没发现异常。然后去应用目录下找日志,发现 /opt/payment/logs/ 下有个 error.log,里面全是数据库连接超时的报错。嗯,问题就出在数据库连接池配置上。

3.3 日志轮转机制:别让日志撑爆磁盘

日志如果不轮转,后果很严重。我见过一个案例,某台服务器因为日志文件涨到 50GB,直接把磁盘撑爆了,导致服务全部宕机。你想想看,一个 access.log 文件,每天写入几百 MB,一个月就是几十 GB。

Linux 下最常用的日志轮转工具是 logrotate。它的配置文件在 /etc/logrotate.conf 和 /etc/logrotate.d/ 目录下。

一个典型的 logrotate 配置长这样:

/var/log/nginx/*.log {
    daily                # 每天轮转一次
    rotate 7             # 保留最近 7 个归档
    compress             # 压缩归档文件
    delaycompress        # 延迟一天再压缩
    missingok            # 日志文件不存在时不报错
    notifempty           # 空文件不轮转
    create 0640 nginx adm # 轮转后创建新日志文件
    sharedscripts        # 所有日志轮转后执行一次脚本
    postrotate
        /bin/kill -USR1 `cat /var/run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

这里有几个关键参数,我解释一下:

参数 含义 推荐值
daily / weekly / monthly 轮转频率 高频日志用 daily,低频用 weekly
rotate N 保留归档数量 7~30,根据磁盘空间定
compress 是否压缩归档 建议开启,节省 80% 空间
maxsize SIZE 日志文件超过此大小强制轮转 100M~1G
postrotate 轮转后执行的命令 通常用于通知应用重新打开日志文件
避坑指南: 我曾经遇到过一个问题:logrotate 配置了 copytruncate,但应用没有正确处理信号,导致日志写入丢失。建议优先使用 create + postrotate 的方式,而不是 copytruncate。

手动测试 logrotate 配置是否正确,可以用这个命令:

# 强制轮转并显示详细信息
logrotate -vf /etc/logrotate.d/nginx

# 检查配置是否有语法错误
logrotate -d /etc/logrotate.d/nginx

3.4 日志路径与轮转机制全景图

下面这张图,把日志定位的核心逻辑串起来了。从日志产生到归档,整个流程一目了然。

日志文件定位与轮转机制全景图 系统日志 /var/log/messages 应用日志 /opt/app/logs/ 安全日志 /var/log/secure logrotate 日志轮转 /etc/logrotate.conf + /etc/logrotate.d/ 轮转策略配置 daily | weekly | monthly | rotate N | compress | maxsize postrotate | create | copytruncate | missingok 归档日志文件 messages.1.gz | messages.2.gz 当前日志文件 messages | access.log | error.log 核心思路:日志统一收集 → 按策略轮转 → 归档压缩 → 释放磁盘空间

3.5 实战:快速定位日志文件

说了这么多理论,来点实际的。假设你现在登录了一台陌生的服务器,怎么快速找到所有日志文件?

  1. 先看系统日志: ls /var/log/,看看有哪些文件
  2. 查应用进程: ps aux | grep java 或 ps aux | grep nginx,找到进程 PID
  3. 看进程打开的文件: lsof -p PID | grep log,直接显示所有日志文件路径
  4. 查配置文件: grep -r "log" /etc/ 或 find / -name "*.conf" -exec grep -l "log" {} \;
  5. 检查 logrotate 配置: ls /etc/logrotate.d/,看看有哪些应用的轮转配置
个人经验: 我最常用的是 lsof 命令。有一次线上问题,应用日志路径配置错了,但进程还在写日志。我用 lsof -p 1234 | grep log 直接找到了实际写入的文件路径,省去了翻配置文件的麻烦。

嗯,日志文件定位这事,说白了就是三个步骤:知道标准路径、会查配置文件、理解轮转机制。掌握了这些,你就能在任何服务器上快速找到想要的日志。