甜品蛋糕网站建设策划书内蒙古seo优化
使用logrotate切割nginx日志
- logrotate简介
- 使用
- 配置文件指令详细解释
- logrotate的切割时间
- 修改切割时间
- 创建定时任务
- 重启crond服务
logrotate简介
logrotate是nginx自带的日志分割程序。字面意思是日志旋转,或者日志转动。就是隔一段时间生成一个日志小文件,保存的文件数量达了设置的日志保存数上限就把最早的删掉。这样看就是这些日志文件在移动,新的变老的,最老的删掉,就像新陈代谢一样。
使用
像nginx一样,它的主配置文件是/etc/logrotate.conf 在其中可以用include指令指定其他程序具体配置文件位置。
例如本次创建切割nginx日志的一个配置
/usr/local/nginx/logs/access.log {# 每天切分daily# 如果日志文件不存在,继续下一个而不报错 missingok#保留30天的日志rotate 30# 压缩旧日志compress# 延迟压缩,即下一次切分时压缩上一次的日志delaycompress# 如果日志为空,不进行切分notifempty# 使用日期作为后缀dateext# 旧文件存放路径olddir /usr/local/nginx/logs/access/# 创建新日志文件的权限和所有者(根据实际情况修改)create 0640 root rootsharedscriptspostrotate# 发送USR1信号给Nginx主进程,让其重新打开日志文件if [ -f /usr/local/nginx/logs/nginx.pid ]; thenkill -USR1 `cat /usr/local/nginx/logs/nginx.pid`fimv /usr/local/nginx/logs/access/access.log-$(date -d "today" +%Y%m%d) /usr/local/nginx/logs/access/access_$(date -d "yesterday" +%Y%m%d).logendscript
}
/usr/local/nginx/logs/access.log用来指定要切分的文件,{}里面是具体配置。
sharedscripts意思是这个配置指定的所有需要切分的文件切分完执行一次下面写的脚本,即 postrotate和endscript之间的脚本,我这里写的脚本的意思是:
1、查看nginx的进程id是否存在,如果存在就向nginx主进程发送USER1信号,让其重新打开日志文件(相当于执行nginx -s reopen
)。这样Nginx就会将新日志写入到新的日志文件(即原来的access.log
和error.log
,而轮转后的旧日志文件会被压缩或保留)。
2、将切出来的日志文件重命名为我希望的名字,我这里配置以dateext,所以切出来的日志会以当前日期结尾,比如access.log-20250604。我将日志文件改名为前一天的日期,例如access_20250603.log,毕竟是在0点切的前一天的日志。
配置文件指令详细解释
compress 通过gzip 压缩转储以后的日志
nocompress 不做gzip压缩处理
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate 备份日志文件不过不截断
create mode owner group 轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate 不建立新的日志文件
delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
missingok 如果日志丢失,不报错继续滚动下一个日志
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty 当日志文件为空时,不进行轮转
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
dateext 使用当期日期作为命名格式
dateformat .%s 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
size(或minsize) log-size 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
size = 5 或 size 5 (>= 5 个字节就转储)
size = 100k 或 size 100k
size = 100M 或 size 100M
logrotate的切割时间
logrotate的切割时间配置在 /etc/anacrontab 中
START_HOURS_RANGE 指定切割开始的时间范围,上图是3点到22点
RANDOM_DELAY 指定基于开始时间的最大随机延迟时间。比如3点开始切割,RANDOM_DELAY等于33,那实际切割的时间就是3点22。
修改切割时间
logrotate是Linux的cron定时任务调度的,上述切割时间就是。这个时间往往满需不了需求,我希望0点切割。又不希望影响cron调度的其他定时任务。那我就重新写一个0点执行的定时任务去执行logrotate 并指定配置文件。该配置文件不能放在/etc/logrotate.d/目录下,因为这样会被cron自动调度,具体是通过/etc/cron.daily/logrotate来调度的
上图/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf 就是执行logrotate的命令
/usr/sbin/logrotate
: 这是logrotate程序的可执行文件路径。-s /var/lib/logrotate/logrotate.status
: 指定logrotate的状态文件路径。状态文件记录了每个日志文件上一次轮转的时间等信息。/etc/logrotate.conf
: 这是logrotate的主配置文件,该文件通常包含其他配置文件的引用(如/etc/logrotate.d/目录下的文件)
为不影响/etc/logrotate.d/下的其他分割配置,为logrotate创建执行nginx日志分割的单独的配置文件
sudo mkdir /etc/logrotate.d.nginx
sudo vim /etc/logrotate.d.nginx/nginx
内容如下:
/usr/local/nginx/logs/access.log {# 每天切分daily# 如果日志文件不存在,继续下一个而不报错 missingok#保留30天的日志rotate 30# 压缩旧日志compress# 延迟压缩,即下一次切分时压缩上一次的日志delaycompress# 如果日志为空,不进行切分notifempty# 使用日期作为后缀dateext# 旧文件存放路径olddir /usr/local/nginx/logs/access/# 创建新日志文件的权限和所有者(根据实际情况修改)create 0640 root rootsharedscriptspostrotate# 发送USR1信号给Nginx主进程,让其重新打开日志文件if [ -f /usr/local/nginx/logs/nginx.pid ]; thenkill -USR1 `cat /usr/local/nginx/logs/nginx.pid`fimv /usr/local/nginx/logs/access/access.log-$(date -d "today" +%Y%m%d) /usr/local/nginx/logs/access/access_$(date -d "yesterday" +%Y%m%d).logendscript
}
/usr/local/nginx/logs/error.log {# 每天切分daily# 如果日志文件不存在,继续下一个而不报错missingok#保留30天的日志rotate 30# 压缩旧日志compress# 延迟压缩,即下一次切分时压缩上一次的日志delaycompress# 如果日志为空,不进行切分notifempty# 使用日期作为后缀dateext# 旧文件存放路径olddir /usr/local/nginx/logs/error/# 创建新日志文件的权限和所有者(根据实际情况修改)create 0640 root rootsharedscriptspostrotate# 发送USR1信号给Nginx主进程,让其重新打开日志文件if [ -f /usr/local/nginx/logs/nginx.pid ]; thenkill -USR1 `cat /usr/local/nginx/logs/nginx.pid`fimv /usr/local/nginx/logs/error/error.log-$(date -d "today" +%Y%m%d) /usr/local/nginx/logs/error/error_$(date -d "yesterday" +%Y%m%d).logendscript
}
创建定时任务
sudo vim /etc/cron.d/logrotate-nginx
填入如下内容
0 0 * * * root /usr/sbin/logrotate -f /etc/logrotate.d.nginx/nginx
重启crond服务
service crond restart 或 systemctl restart crond.service