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 文件,是不是就慌了?
/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 |
轮转后执行的命令 | 通常用于通知应用重新打开日志文件 |
copytruncate,但应用没有正确处理信号,导致日志写入丢失。建议优先使用 create + postrotate 的方式,而不是 copytruncate。
手动测试 logrotate 配置是否正确,可以用这个命令:
# 强制轮转并显示详细信息
logrotate -vf /etc/logrotate.d/nginx
# 检查配置是否有语法错误
logrotate -d /etc/logrotate.d/nginx
3.4 日志路径与轮转机制全景图
下面这张图,把日志定位的核心逻辑串起来了。从日志产生到归档,整个流程一目了然。
3.5 实战:快速定位日志文件
说了这么多理论,来点实际的。假设你现在登录了一台陌生的服务器,怎么快速找到所有日志文件?
- 先看系统日志:
ls /var/log/,看看有哪些文件 - 查应用进程:
ps aux | grep java或ps aux | grep nginx,找到进程 PID - 看进程打开的文件:
lsof -p PID | grep log,直接显示所有日志文件路径 - 查配置文件:
grep -r "log" /etc/或find / -name "*.conf" -exec grep -l "log" {} \; - 检查 logrotate 配置:
ls /etc/logrotate.d/,看看有哪些应用的轮转配置
lsof 命令。有一次线上问题,应用日志路径配置错了,但进程还在写日志。我用 lsof -p 1234 | grep log 直接找到了实际写入的文件路径,省去了翻配置文件的麻烦。
嗯,日志文件定位这事,说白了就是三个步骤:知道标准路径、会查配置文件、理解轮转机制。掌握了这些,你就能在任何服务器上快速找到想要的日志。