一、系统日志基础管理
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
文件)的权限和所有者设置。
postrotate
和 endscript
- 作用:定义日志轮转后的额外操作(需包裹在
postrotate
和endscript
之间)。 - 具体脚本逻辑:
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 # 搜索失败的密码登录尝试
五、最佳实践(新手必看)
- 定期备份日志
tar czvf log_backup_$(date +%Y%m%d).tar.gz /var/log # 打包压缩日志目录
- 设置日志保留周期
-
根据业务需求调整
logrotate
中的rotate
参数(如保留30天:rotate 30
)。 -
实时监控关键日志
tail -f /var/log/secure | grep "Failed" # 实时监控登录失败日志
重点关注
logrotate
配置(避免日志占满磁盘)和auditd
规则(记录敏感操作),确保系统稳定和安全。