一、文档介绍
本文档描述 Linux 操作系统下几种常见日志切割场景的操作情况。
二、名词解释
logrotate 是一个 Linux 日志管理工具,用于自动分割、删除日志等功能,节省磁盘空间,避免磁盘空间过载问题。它基于 CRON 运行。
三、部署
Linux 操作系统默认自带 logrotate,若命令不存在,通过以下命令安装:
yum install logrotate -y
配置文件:
- /etc/logrotate.conf
- /etc/logrotate.d/
默认情况下,logrotate 会使用 CRON 作为定时任务调度器进行日志轮转。可以编辑 /etc/cron.daily/logrotate 文件,修改定时任务的执行时间和其他设置。
四、常用命令
# 检查指定的日志轮转配置文件
logrotate -d /etc/logrotate.d/LogExample
# 手动执行指定的日志轮转
logrotate -f /etc/logrotate.d/LogExample
五、参数说明
参数 | 说明 |
compress | 通过 gzip 对转储以后的日志进行压缩 |
nocompress | 不对日志进行 gzip 压缩处理 |
copytruncate | 用于处理还在打开中的日志文件,以先拷贝再清空的方式对当前日志进行备份并截断操作;由于拷贝和清空之间有一个时间差,可能会丢失部分日志数据 |
nocopytruncate | 备份日志文件但不进行截断操作 |
create | 轮转时指定创建新文件,可指定权限、属主和属组 |
nocreate | 日志轮转后不创建新的日志文件 |
delaycompress | 发生轮转的日志文件到下一次转储时才压缩 |
nodelaycompress | 日志轮转同时进行压缩 |
missingok | 如果日志丢失,忽略此日志不产生报错 |
errors | 轮转时产生的错误信息发送到指定的 Email 地址 |
ifempty | 空日志也进行日志轮转 |
notifempty | 空日志不进行轮转 |
olddir | 轮转后的日志文件放入指定的目录,指定目录和当前日志文件需要在同一个文件系统 |
noolddir | 轮转后的日志文件和当前日志文件放在同一个目录下 |
sharedscripts | 所有日志都轮转后统一执行 postrotate 脚本 |
prerotate | 在日志轮转之前需要执行的指令 |
postrotate | 在日志轮转之后需要执行的指令 |
daily | 指定轮转周期为每天 |
weekly | 指定轮转周期为每周 |
monthly | 指定轮转周期为每月 |
rotate | 指定日志文件保留次数,与daily、weekly、monthly 参数结合使用 |
dateext | 使用当期日期作为轮转日志的后缀名 |
dateformat | 配合 dateext 使用,紧跟在下一行出现,定义文件切割后的文件名,只支持 %Y %m %d %s 这四个参数 |
size | 当日志文件到达指定的大小时才轮转 |
六、示例
(一) tomcat
配置文件:/etc/logrotate.d/tomcat
/path/to/tomcat/logs/catalina.out {
daily
create 600 myuser myuser
rotate 30
missingok
notifempty
compress
copytruncate
dateext
}
(二) mysql
配置文件:/etc/logrotate.d/mysql
/path/to/mysql/logs/*.log {
daily
rotate 180
missingok
create 777 mysql mysql
notifempty
compress
dateext
postrotate
# just if mysqld is really running
if test -x /usr/local/mysql/bin/mysqladmin && \
/usr/local/mysql/bin/mysqladmin -uroot -pPassWord ping &>/dev/null
then
/usr/local/mysql/bin/mysqladmin -uroot -pPassWord flush-logs
fi
endscript
}
(三) nginx
配置文件:/etc/logrotate.d/nginx
/path/to/nginx/logs/*.log {
daily
missingok
rotate 90
compress
delaycompress
notifempty
create 640 nginx nginx
sharedscripts
postrotate
if [ -f /path/to/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /path/to/nginx/logsnginx.pid`
fi
endscript
}