日志管理
Linux/Unix 系统使用 Logrotate 来管理日志文件。
bash
echo "
/server/logs/redis/redis-server.log {
monthly
maxsize 100M
missingok
rotate 12
compress
delaycompress
dateext
dateformat -%Y%m%d.%s
dateyesterday
create 0640 redis redis
sharedscripts
postrotate
if [ -f /run/redis/process.pid ]; then
/usr/bin/kill -USR1 \$(/bin/cat /run/redis/process.pid)
fi
endscript
}
" > /etc/logrotate.d/redisbash
echo "
/server/logs/nginx/access/*.log {
daily
maxsize 100M
missingok
rotate 30
compress
delaycompress
dateext
dateformat -%Y%m%d.%s
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
if [ -f /run/nginx/process.pid ]; then
/usr/bin/kill -USR1 \$(/bin/cat /run/nginx/process.pid)
fi
endscript
}
/server/logs/nginx/error/*.log {
monthly
maxsize 100M
missingok
rotate 12
compress
delaycompress
dateext
dateformat -%Y%m%d.%s
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
if [ -f /run/nginx/process.pid ]; then
/usr/bin/kill -USR1 \$(/bin/cat /run/nginx/process.pid)
fi
endscript
}
" > /etc/logrotate.d/nginxbash
echo "/server/logs/redis/redis-server.log {
# 轮转周期 daily/weekly/monthly/yearly 对应 每天/每周/每月/每年
# 每天轮转(切割)一次
daily
# 若日志大小超过100M,即使未到周期也轮转
maxsize 100M
# 日志文件不存在时忽略错误,继续执行
missingok
# 保留30个备份
rotate 30
# 压缩旧日志以节省空间(使用gzip)
compress
# 延迟压缩:本次轮转的日志在下一次轮转时才压缩
delaycompress
# 使用日期作为轮转文件的后缀
dateext
# 可选:自定义日期格式,例如 -20250901.1714900000
dateformat -%Y%m%d.%s
# 可选:使用前一天的日期而非轮转执行日期
# dateyesterday
# 复制当前日志文件后清空原文件,避免需重启Redis或发送信号(与 create 二选一)
# copytruncate
# 轮转后创建的新日志文件权限和属主(用户和组请根据实际情况调整)
create 0640 redis redis
# 所有日志文件处理完后,只执行一次postrotate脚本
sharedscripts
# 轮转后执行的脚本
postrotate
# 如果使用 copytruncate 无须发送信号,但有可能丢失极小量的日志
# 通过pid文件向Redis进程发送USR1信号,使其重新打开日志文件
if [ -f /run/redis/process.pid ]; then
# 这里是写入文件,需注意“$”符号转义
/usr/bin/kill -USR1 \$(/bin/cat /run/redis/process.pid)
fi
endscript
}" > /etc/logrotate.d/redis| 常用指令 | 描述 |
|---|---|
logrotate -vf /etc/logrotate.conf | 强制立即轮转所有配置文件(-v 显示详细过程) |
logrotate -vf /etc/logrotate.d/your_config | 强制立即轮转指定的配置文件(-v 显示详细过程) |
logrotate -d /etc/logrotate.d/your_config | 模拟轮转过程并显示详细信息 |
grep logrotate /var/log/syslog | 查看 logrotate 自身的执行记录和可能出现的错误信息 |
⚠️ copytruncate/create 两者区别
copytruncate :
- 复制当前日志文件后清空原文件,避免需重启 Redis 或发送信号
- 对于不支持主动重新打开日志的程序非常有用
- 但理论上在复制和清空之间可能有极小量的日志丢失
create :
- 确保日志不丢失,
- 需要配置
Logrotate脚本,在轮转后对程序发送信号,重新打开日志
