方案一 脚本+crontab
一、 编写脚本
vi nginx-split.sh # 拷贝日志文件到 昨天的log中 -b split 可以进行文件切割,如果不需要文件的切割可以将 split -b 100k -d 换成 cp ,-b指定单个文件大小,-d 指定如果单个文件过大,进行切割时文件的后缀为数字 split -b 100k -d /opt/nginx.log /opt/logs/nginx.log.`date -d yesterday +%Y%m%d-%H:%M:%S`.log # 清空nginx.log 日志,这个地方于要写绝对路径,否则导致日志文件不会被清空 cat /dev/null > /opt/nginx.log
二、授权
给刚才编辑是脚本文件授予执行权限
chmod u+x nginx-split.sh
二、加入定时器
crontab -e #每隔1分钟执行一次 */1 * * * * /opt/nginx-split.sh
定时任务加入成功以后会有如下提示:
查看定时任务列表,以及定时任务是否在正常执行
如果输入pgrep cron 没找到相关进程,则任务也不会执行。=
最后执行的结果如下:
缺点: 如果日志文件比较大,MV是需要时间的,这段时间内的日志有可能丢失。logrotate可以在切割日志的同时,不丢失数据
方案二 logrotate+crontab
参考文章: Linux日志切割神器logrotate原理介绍和配置详解
logrotate 程序是一个日志文件管理工具(一般centos都自带)。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转 储,这个过 程一般通过 cron 程序来执行。logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。系统自带的日志切割的配置文件在/etc/logrotate.conf 和 /etc/logrotate.d/syslog 里面。
一、 编写配置文件
vim test-logsplit /opt/my/test.log{ daily #配置能有多少个日志文件,超过了就会将以前的删除 rotate 10 missingok notifempty minsize=1M maxsize=10M #等test.log 到这个大小就会进行日志切割,而不是切割后的日志文件 size=1M sharedscripts postrotate cat /dev/null > /opt/my/test.log endscript }
需要注意的是如果报这个错误一般就是文件编码错误,将文件删除,重新手动输入一遍。
加入定时器
crontab -e # 每一分钟执行一次 */1 * * * * /usr/sbin/logrotate -vf /opt/test-logsplit
结果如下图: