日志收集基础:日志文件位置、轮转机制与权限管理
日志这东西,说白了就是系统的「黑匣子」。
我刚做运维那会儿,遇到服务器出问题,第一反应就是去翻日志。但翻了半天发现——日志文件太大打不开?权限不够?日志被覆盖了?这些坑我全踩过。今天咱们就把日志收集的基础打牢,从文件位置、轮转机制到权限管理,一个一个说清楚。
核心要点:日志收集的三大基石——知道日志在哪(位置)、怎么切分(轮转)、谁能看(权限)。这三件事搞不定,后面分析全是白搭。
1. 日志文件位置:/var/log 里的秘密
几乎所有 Linux 发行版,日志都放在 /var/log 目录下。我习惯用 ls -lh /var/log 先扫一眼,看看都有哪些文件。
常见的日志文件有哪些?我列个表,你对照着看:
| 日志文件 | 用途 | 我踩过的坑 |
|---|---|---|
/var/log/messages |
系统通用日志,记录内核、服务等消息 | 曾经以为它包含所有日志,结果发现应用日志根本不在这 |
/var/log/syslog |
Debian/Ubuntu 系统的通用日志 | 和 messages 容易搞混,其实看发行版 |
/var/log/auth.log |
认证日志,记录登录、sudo 等操作 | 排查 SSH 爆破时,这个文件是救命稻草 |
/var/log/kern.log |
内核日志,硬件驱动、系统崩溃信息 | 有一次服务器频繁重启,就是在这找到的硬件报错 |
/var/log/nginx/access.log |
Nginx 访问日志 | 默认不轮转,曾经撑爆过磁盘 |
/var/log/mysql/error.log |
MySQL 错误日志 | 权限没配好,MySQL 启动时写不了日志,直接挂掉 |
嗯,这里要注意:不同发行版、不同应用,日志位置可能不一样。比如 CentOS 用 /var/log/messages,Ubuntu 用 /var/log/syslog。我个人习惯先查一下 /etc/rsyslog.conf 或 /etc/rsyslog.d/ 下的配置,确认日志到底写哪去了。
小技巧:用 grep -r "log" /etc/rsyslog.d/ 可以快速找到所有日志路径配置。我每次接手新服务器,第一件事就是跑这条命令。
2. 日志轮转机制:logrotate 实战
日志如果不轮转,会一直写下去。你想想看,一个日志文件几十个 G,用 cat 都打不开,更别说分析了。
logrotate 就是干这个的——按时间或大小切分日志,压缩旧的,删除太老的。
它的配置文件在 /etc/logrotate.conf 和 /etc/logrotate.d/ 目录下。我举个例子,Nginx 的日志轮转配置:
/var/log/nginx/*.log {
daily # 每天轮转一次
rotate 7 # 保留最近 7 个轮转文件
compress # 压缩旧日志
delaycompress # 延迟一天压缩,方便查看
missingok # 日志文件不存在时不报错
notifempty # 空文件不轮转
create 0640 nginx adm # 轮转后创建新日志文件,权限 0640
sharedscripts # 所有日志轮转完后执行一次脚本
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
这段配置什么意思?我拆开讲:
- daily:每天切一次。也可以用
weekly、monthly,或者size 100M按大小切。 - rotate 7:保留 7 个历史文件。超过 7 个,最老的自动删除。
- compress:用 gzip 压缩,节省磁盘空间。
- postrotate:轮转后通知 Nginx 重新打开日志文件。这个很关键,不然 Nginx 还会往旧文件里写。
警告:我曾经遇到过一个问题——logrotate 配置了 copytruncate 而不是 create,结果日志文件被截断时,应用还在写,导致日志内容丢失。所以,能用 create 就别用 copytruncate,除非应用不支持重新打开日志。
手动测试 logrotate 配置是否正确?用这条命令:
logrotate -d /etc/logrotate.d/nginx
-d 是 debug 模式,只模拟执行,不会真的切分日志。我每次改完配置,都会先跑一遍这个,确认没问题再让它自动运行。
3. 日志权限管理:该谁看,不该谁看
日志里可能包含敏感信息——用户 IP、登录时间、甚至密码错误记录。权限管不好,就是安全漏洞。
我一般遵循这几个原则:
- 日志文件属主是 root,普通用户不能直接读。
- 日志目录权限设为 750,只有 root 和 adm 组能进。
- 日志文件权限设为 640,属主可读写,属组可读,其他人无权限。
举个例子,设置 /var/log/nginx/ 目录的权限:
chown -R root:adm /var/log/nginx
chmod 750 /var/log/nginx
find /var/log/nginx -type f -exec chmod 640 {} \;
为什么要用 adm 组?因为很多监控工具(比如 rsyslog、auditd)都是以 adm 组成员身份运行的。把运维账号加入 adm 组,就能读取日志,又不用给 root 权限。
避坑指南:我曾经把日志目录权限设成了 777,结果被安全扫描工具报了个高危漏洞。后来改成 750,问题解决。记住:日志权限宁严勿松。
还有一个容易被忽略的点——logrotate 创建新日志文件时,权限怎么继承?看上面 Nginx 配置里的 create 0640 nginx adm,就是指定新文件的权限和属主属组。如果不写,默认用 create 0600 root root,可能导致应用写不了日志。
知识体系结构图
下面这张图,把日志收集基础的三个核心模块串起来了:
这张图把三个模块的关系画清楚了。日志位置是基础,轮转机制保证日志不撑爆磁盘,权限管理确保安全。三者缺一不可。
总结一下:
- 日志位置:记住
/var/log是主战场,不同应用可能分散在不同子目录。 - 日志轮转:logrotate 是标配,配置时注意
create和postrotate这两个关键点。 - 权限管理:用
adm组管理日志读取权限,别给 777。
这些基础打牢了,后面分析日志才能得心应手。我当年就是吃了权限的亏,排查问题花了两天,最后发现是日志没权限读——你说冤不冤?