日志管理


一、系统日志基础管理

1. 核心日志文件位置(均位于 /var/log/ 目录)

/messages        # 系统通用日志(服务启动、错误信息等)
/secure          # 安全日志(用户登录、认证失败记录)
/maillog         # 邮件服务日志
/boot.log        # 系统启动日志
/audit/audit.log # 系统审计日志(用户操作、文件变更等)

2. 常用日志查看命令

tail -f /var/log/messages      # 实时监控最新日志(按Ctrl+C停止)
grep "error" /var/log/messages # 搜索包含"error"的日志行
less /var/log/secure           # 分页查看日志(按空格翻页,q退出)
journalctl -u httpd.service    # 查看HTTPD服务的systemd日志(CentOS 7默认日志系统)

二、日志轮转工具 logrotate(自动清理旧日志)

1. 全局配置文件

主配置:/etc/logrotate.conf(定义通用策略) 自定义服务配置:/etc/logrotate.d/ 目录(如/etc/logrotate.d/httpd

2. 典型配置示例(以系统通用日志为例)

vim /etc/logrotate.d/messages

/var/log/messages {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0640 root root
    postrotate
        if [ -x /usr/sbin/service ]; then
            service rsyslog restart > /dev/null 2>&1
        else
            systemctl restart rsyslog > /dev/null 2>&1
        fi
    endscript
}

3. 手动触发日志轮转

logrotate -f /etc/logrotate.d/messages # 强制立即轮转messages日志
logrotate -f /etc/logrotate.conf  # 强制立即轮转所有日志(用于测试)

4. 配置解释如下

daily

  • 作用:指定日志按天轮转(每天生成一个新日志文件)。
  • 说明:日志文件会以 messages-YYYYMMDD 的格式命名(如 messages-20250417)。

rotate 7

  • 作用:保留最近 7天 的轮转日志,超过7天的旧日志会被删除。
  • 说明:最终会保留 messages(当前日志)和 messages-xxxxxx 格式的7个历史日志文件。

compress

  • 作用:对轮转后的旧日志进行压缩(使用 gzip 压缩,生成 .gz 文件)。
  • 说明:压缩可减少磁盘占用,但会增加读取时的解压开销。

missingok

  • 作用:如果指定的日志文件(如 /var/log/messages)不存在,不报错,继续执行后续操作。
  • 说明:避免因日志文件尚未生成或被意外删除导致的错误。

notifempty

  • 作用:如果日志文件为空,不执行轮转操作(即不生成空的轮转文件)。
  • 说明:防止生成无意义的空日志文件及其压缩包。

create 0640 root root

  • 作用:轮转后创建的新日志文件(即当前 messages 文件)的权限和所有者设置。

postrotateendscript

  • 作用:定义日志轮转后的额外操作(需包裹在 postrotateendscript 之间)。
  • 具体脚本逻辑
if [ -x /usr/sbin/service ]; then
    service rsyslog restart > /dev/null 2>&1
else
    systemctl restart rsyslog > /dev/null 2>&1
fi
  • 条件判断:检查系统是否存在 service 命令(用于旧版 SysVinit 系统,如 CentOS 6)。
  • 分支逻辑
    • 如果存在 service:使用 service rsyslog restart 重启日志服务(适用于 SysVinit)。
    • 否则:使用 systemctl restart rsyslog 重启(适用于 systemd 系统,如 CentOS 7+、Ubuntu 15.04+)。
  • > /dev/null 2>&1:将命令输出和错误信息丢弃,避免日志轮转时产生多余输出。

整体逻辑总结

  • 每天:logrotate 会检查 /var/log/messages,若文件非空:
  • 将当前日志重命名为 messages-YYYYMMDD.gz(压缩并保留7天)。
  • 创建新的 messages 文件,权限为 0640,所有者为 root:root
  • 重启 rsyslog 服务,确保新日志被正确写入(关键:若不重启,rsyslog 可能继续写入旧日志文件)。

为什么需要重启 rsyslog

  • rsyslog 服务在日志被轮转(重命名或删除)后,不会自动切换到新日志文件,需通过重启(或 kill -HUP 信号)让其重新打开日志文件。上述脚本通过兼容不同初始化系统的方式,确保 rsyslog 正确重启,避免日志写入失败。

三、日志文件权限安全

1. 设置严格权限(防止未授权访问)

chmod 600 /var/log/secure    # 仅root可读可写(安全日志敏感)
chmod 640 /var/log/messages  # 允许root和adm组读取(通用日志)
chown root:root /var/log/audit/audit.log  # 确保审计日志由root所有

2. 禁止日志文件被删除(重要服务器)

chattr +i /var/log/audit/audit.log  # 添加不可删除属性(需root执行,删除需先执行chattr -i)

四、常见问题排查

1. 日志不更新?

systemctl status rsyslog  # 检查日志服务是否运行(CentOS 7默认日志服务)
systemctl restart rsyslog # 重启服务

2. 磁盘空间被日志占满?

du -sh /var/log/*        # 查看各日志目录大小
logrotate -f /etc/logrotate.conf  # 手动清理旧日志

3. 查找登录失败记录

grep "Failed password" /var/log/secure  # 搜索失败的密码登录尝试

五、最佳实践(新手必看)

  1. 定期备份日志
tar czvf log_backup_$(date +%Y%m%d).tar.gz /var/log  # 打包压缩日志目录
  1. 设置日志保留周期
  2. 根据业务需求调整 logrotate 中的 rotate 参数(如保留30天:rotate 30)。

  3. 实时监控关键日志

tail -f /var/log/secure | grep "Failed"  # 实时监控登录失败日志

重点关注 logrotate 配置(避免日志占满磁盘)和 auditd 规则(记录敏感操作),确保系统稳定和安全。