日志收集基础:日志文件位置、轮转机制与权限管理

日志这东西,说白了就是系统的「黑匣子」。

我刚做运维那会儿,遇到服务器出问题,第一反应就是去翻日志。但翻了半天发现——日志文件太大打不开?权限不够?日志被覆盖了?这些坑我全踩过。今天咱们就把日志收集的基础打牢,从文件位置、轮转机制到权限管理,一个一个说清楚。

核心要点:日志收集的三大基石——知道日志在哪(位置)、怎么切分(轮转)、谁能看(权限)。这三件事搞不定,后面分析全是白搭。

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 工具 日志权限管理 安全与合规 messages / syslog / auth.log 应用日志:nginx / mysql rsyslog 配置决定路径 按时间轮转:daily / weekly 按大小轮转:size 100M 压缩 / 保留数量 / postrotate 属主 root,属组 adm 目录 750,文件 640 logrotate 创建时指定权限 三者配合:知道日志在哪 → 自动轮转不撑爆 → 权限安全合规

这张图把三个模块的关系画清楚了。日志位置是基础,轮转机制保证日志不撑爆磁盘,权限管理确保安全。三者缺一不可。

总结一下:

  • 日志位置:记住 /var/log 是主战场,不同应用可能分散在不同子目录。
  • 日志轮转:logrotate 是标配,配置时注意 create 和 postrotate 这两个关键点。
  • 权限管理:用 adm 组管理日志读取权限,别给 777。

这些基础打牢了,后面分析日志才能得心应手。我当年就是吃了权限的亏,排查问题花了两天,最后发现是日志没权限读——你说冤不冤?

可可精品资料库