日志轮转(log rotation)是Linux系统中管理日志文件的重要机制,它可以防止日志文件无限增长占用磁盘空间。在Linux中,主要通过logrotate工具来实现日志轮转。
logrotate的配置文件通常位于:
- 主配置文件:/etc/logrotate.conf
- 特定服务配置:/etc/logrotate.d/目录下的各个文件
/var/log/myapp.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 root adm
sharedscripts
postrotate
/usr/bin/systemctl reload myapp.service > /dev/null
endscript
}
| 指令 | 说明 |
|---|---|
| daily/weekly/monthly | 轮转周期 |
| rotate N | 保留N个旧日志文件 |
| size 10M | 日志达到指定大小时轮转 |
| compress | 使用gzip压缩旧日志 |
| delaycompress | 延迟压缩(下一次轮转时压缩) |
| missingok | 日志不存在时不报错 |
| notifempty | 空日志不轮转 |
| create MODE OWNER GROUP | 轮转后创建新日志文件的权限 |
| sharedscripts | 所有日志轮转后再执行脚本 |
| postrotate/endscript | 轮转后执行的脚本 |
在/etc/logrotate.d/目录下创建新配置文件
sudo vi /etc/logrotate.d/nginx
添加配置内容,例如:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
创建配置文件:
sudo vi /etc/logrotate.d/myapp
添加配置内容:
/var/log/myapp/*.log {
size 50M
rotate 5
compress
missingok
notifempty
copytruncate
}
sudo logrotate -d /etc/logrotate.d/your_config
sudo logrotate -vf /etc/logrotate.d/your_config
/var/log/app.log {
daily
dateext
dateformat -%Y%m%d
rotate 30
compress
}
对于持续写入的日志(如Java应用),使用copytruncate选项:
/var/log/tomcat/catalina.out {
copytruncate
daily
rotate 7
compress
missingok
}
/var/log/myapp/*.log /var/log/myapp/*.err {
weekly
rotate 4
compress
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
endscript
}
/etc/cron.daily/logrotate)通过合理配置logrotate,可以有效管理系统日志,防止磁盘空间被日志文件占满,同时保留足够的历史日志用于故障排查。