随着访问量的增长,日志文件会越来越大,时间长既会影响访问的速度,也会占用一部分磁盘空间,所以需要按天切割access和error日志。
利用系统服务——logrotate
logrotate是一个linux系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间/大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令
logrotate是基于crontab运行的,所以这个时间点是由crontab控制的,具体可以查询crontab的配置文件/etc/anacrontab。系统会按照计划的频率运行logrotate,通常是每天。在大多数的Linux发行版本上,计划每天运行的脚本位于/etc/cron.daily/logrotate
主流Linux发行版上都默认安装有logrotate包,如果你的linux系统中找不到logrotate, 可以使用apt-get或yum命令来安装
logrotate日志分割配置:
注意:该文件无法识别中文,需要将注释删除
vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
daily # 日志归档周期为1天
size 1 # 日志文件最小为1字节时才执行归档
minsize 1 # 日志文件最小为1字节时才执行归档
notifempty # 日志文件不为空时才执行归档
dateext # 归档文件名添加时间字符串
dateformat -%Y%m%d%H # 归档文件名时间字符串格式为-%Y%m%d%H
dateyesterday # 归档文件名时间字符串以归档操作的前一天为时间戳
extension .log # 归档文件名中保留日志的扩展名
compress # 归档文件执行压缩
delaycompress # 在归档执行的下个周期再进行压缩
create # 以创建新文件方式实现日志归档
olddir /data/backup/nginx_logs # 归档文件存储目录
createolddir # 归档文件存储目录不存在时自动创建
postrotate # 归档执行后执行脚本
/usr/local/nginx/sbin/nginx -s reopen -g "pid /run/nginx.pid;"
# 通知Nginx重新打开日志文件
endscript
sharedscripts # 启用脚本共享模式
maxage 7 # 归档文件最多保留7天
rotate 7 # 归档文件最多保留7份
}
}
如果提示权限不够而分割失败,这是因为开启了selinux导致,解决方案有如下2种:
1、关闭selinux
2、修改待分割的日志文件所在目录的权限
参数 | 说明 |
---|---|
copytruncate | 拷贝原日志文件,并将其大小变为0 |
daily | 每天切割 |
rotate 15 | 保留最多15个文件 |
compress | 压缩分割后的文件 |
missingok | 文件丢失了,继续切割而不报错 |
size 200M | 当文件大于200M时,就切割 |
dateext | 切割后的日志文件以当前日期YYYYMMDD为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式 |
compresscmd | 指定压缩的命令,默认 gzip |
uncompresscmd | 用于解压缩的日志文件的命令 默认是 gunzip |
compressext | 启用压缩的扩展名,默认 gzip 的扩展名就是 .gz |
copy | 制作日志文件的副本,与create选项互斥 |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。与create选项互斥 |
create mode owner group | 在切割后,创建新的日志文件,并指定数据的权限和所有者和所属组 |
dateformat format_string | 指定日志文件后缀日期格式 |
ifempty | 表示即使是空文件也要选择,该选项是默认值。与 notifempty 相反 |
notifempty | 当日志文件为空时,不进行轮转,与 ifempty 相反 |
mailfirst | 当配置了邮件地址,指定发送最新的文件 |
maillast | 当配置了邮件地址,指定发送最旧的文件,(默认设置) |
rotate count | 日志保留的次数, 如果该参数不写的话,默认就是删除之前所有的文件日志。比如切割了200次,那么只保留最新的180次日志,并删除旧的20次日志。如果配置文件指定的是 daily,那每天切割一次日志,就意味着保留180天日志。 |
maxage count | 删除早于 count 天的日志,如果配置了 mail 则通过邮件发送 |
weekly | 每周运行一次,通常在每周的第一天 |
monthly | 每月运行一次切割,通常会在该月的第一天 |
yearly | 如果当前年份与上一次年份不相同,就会进行切割 |
nocompress | 不进行压缩 |
size size | 日志文件达到多大就切割 |
olddir dir | 切割后存放的目录 |
start count | 当没有指定日期后缀,将数字作为后缀内容,默认是从 1 开始 。可以指定其他数字开始 |
missingok | 如果日志丢失,不报错继续滚动下一个日志 |
mail 112@163.com | 该参数与 rotate 是有关联的,当超过 rotate 指定次数,文件不是删除,而是通过邮件发送到指定位置 |
prerotate | 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行 |
postrotate | 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行 |
hourly | 每个小时切割 |
nocreate | 不建立新的日志文件 |
delaycompress | 和compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩。 |
errors address | 转储时的错误信息发送到指定的Email 地址 |
常用命令
logrotate -d -f /etc/logrotate.d/nginx # 测试配置文件是否配置正常
logrotate -f /etc/logrotate.d/nginx # 立刻切割文件,可以将该命令放到定时任务中实现定时切割
评论区