一 简单实现
# 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 {} \;