一 简单实现
# head命令 # 开头n行 head -10000 java.log > javaHead.log # tail命令 # 最后n行 tail -10000 java.log > javaTail.log # sed命令 # 第N行截取到第M行 sed -n '1,50000p' java.log > javaRange.log # split命令 # 每300行切分生成一个新文件,–verbose 显示切分进度 split -l 300 java.txt javaLog --verbose # 每10M切分成一个新的文件,–verbose 显示切分进度 split -d 10m java.txt javaLog --verbose
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
如果日志文件比较大,MV是需要时间的,这段时间内的日志有可能丢失
日志切割工具logrotate
- 系统自带的日志切割的配置文件在/etc/logrotate.conf 和 /etc/logrotate.d/syslog 里
- logrotate可以在切割日志的同时,不丢失数据
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 chmod 640 /opt/log/mylog.1 # 设置日志文件的权限 chmod 640 /opt/log/mylog.2 # 设置其他分割后的日志文件的权限 endscript }
- 添加定时任务
crontab -e
# 每一分钟执行一次 */1 * * * * /usr/sbin/logrotate -vf /opt/test-logsplit
- 查看定时任务列表,以及定时任务是否在正常执行
crontab -l
- 配置文件是否正确
logrotate -d /etc/logrotate.d/nginx
- 强制执行:
logrotate -f /etc/logrotate.d/nginx 或 logrotate -f /etc/logrotate.conf
- 强制以调试模式执行
sudo /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx
- 显示详细清理过程
logrotate -v /etc/logrotate.d/nginx
定时任务生效
service crond restart # systemctl restart crond
- logrotate参数详解
daily #指定转储周期为每天 weekly #指定转储周期为每周; monthly #指定转储周期为每月; rotate count #指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份; compress #通过gzip压缩转储以后的日志; nocompress #不需要压缩时,用这个参数; delaycompress #延迟压缩,和compress一起使用时,转储的日志文件到下一次转储时才压缩; nodelaycompress #覆盖delaycompress选项,转储同时压缩; copytruncate #用于还在打开中的日志文件,把当前日志备份并截断; nocopytruncate #备份日志文件但是不截断; create mode owner group #转储文件,使用指定的文件模式创建新的日志文件; nocreate #不建立新的日志文件; errors address #专储时的错误信息发送到指定的Email地址; ifempty #即使是空文件也转储,这个是logrotate的缺省选项; notifempty #如果是空文件的话,不转储; mail address #把转储的日志文件发送到指定的E-mail地; nomail #转储时不发送日志文件; olddir directory #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统; noolddir #转储后的日志文件和当前日志文件放在同一个目录下; prerotate/endscript #在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行; postrotate/endscript #在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行; tabootext [+] list #让logrotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave,v,和~ ; size size #当日志文件到达指定的大小时才转储,Size可以指定bytes(缺省)以及KB(sizek)或者MB(sizem); postrotate <s> endscript #日志轮换过后指定指定的脚本,endscript参数表示结束脚本; sharedscripts #共享脚本,下面的postrotate <s> endscript中的脚本只执行一次即可;
- nginx日志
vim /etc/logrotate.d/nginxLogrotate
/home/APPDeploy/nginx-1.16.0/logs/*.log { #日志文件所在的路径 daily #每天进行日志分割 missingok #在日志转储期间,任何错误将被忽略 rotate 30 #保留30个备份 compress #通过gzip压缩转储以后的日志 delaycompress #delaycompress和compress一起使用时,转储的日志文件到下一次转储时才压缩,即这次切割的日志不压缩 dateext #日志后面带时间,如:nginx.access.log-20190516 #dateformat -%Y%m%d%s #日志时间格式 #dateyesterday #如果定时任务时间设置的是0点就要配置此项,不然切割的内容是昨天的但是日志名却是当天的. notifempty #当日志文件为空时,不进行轮转 create 644 APPDeploy APPDeploy #轮转时指定创建新文件的属性 sharedscripts #运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 postrotate #在logrotate转储之后需要执行的指令,下面的脚本作用是让nginx将日志内容存储在新的日志文件中. if [ -f /home/APPDeploy/nginx-1.16.0/run/nginx.pid ]; then kill -USR1 `cat /home/APPDeploy/nginx-1.16.0/run/nginx.pid` fi endscript }
vim nginx_cron # 同时切割两个日志 /app/nginx/log/access.log{ daily #配置能有多少个日志文件,超过了就会将以前的删除 rotate 10 missingok notifempty minsize=1M maxsize=10M #等log 到这个大小就会进行日志切割,而不是切割后的日志文件 size=1M sharedscripts postrotate cat /dev/null > /app/nginx/log/access.log endscript } /app/nginx/log/error.log{ daily #配置能有多少个日志文件,超过了就会将以前的删除 rotate 10 missingok notifempty minsize=1M maxsize=10M #等log 到这个大小就会进行日志切割,而不是切割后的日志文件 size=1M sharedscripts postrotate cat /dev/null > /app/nginx/log/error.log endscript }
# 通配符匹配多个文件 /app/nginx/log/*.log{ su root root daily rotate 5 missingok notifempty dateext olddir /root create 644 root root postrotate cat /dev/null > /app/nginx/log/*.log endscript }
删除30天前的日志
# !/bin/sh # 删除 Linux 系统 /opt/minio/logs 目录下30天前的.log 日志文件。 find /opt/minio/logs -mtime +30 -name '*.log' -exec rm -rf {} \;