日志切割与转储
1、背景
收到硬件处邮件,某台生产机器磁盘空间使用率过高。经过核查,ng的访问日志(access.log)、rocketmq客户端日志文件都比较大,都是些可有可无的日志,所以选了折中方案,删一部分,压缩存一部分。同时又不能完全删除,比如我们要ng日志做流量、平响分析。
2、切割、转储备份
2.1、常用linux命令及解释
1、|wc -l
统计多少行(例:统计数据库连接数,netstat -apn|grep 3306|wc -l)
2、-exec rm {} \;
把find命令查找到的结果删除
-exec后便跟的命令行,必须用“ \;”结束
3、midir -p
选项 -p 如果父目录不存在级联创建
4、find选项-maxdepth
使用mindepth和maxdepth限定搜索指定目录的深度,搜索文件
find / -maxdepth 3 -name passwd
/usr/bin/passwd
/etc/pam.d/passwd
/etc/passwd
5、gzip
不保留原文件压缩,压缩文件名称和原文件一样(方便于压缩但不想保留原文件)
解压命令gzip
6、> /dev/null 2>&1
文件标识符,0 标准输入、1 标准输出、2 标准错误输出
/dev/null:不输出信息
crontab -e
00 00 * * * /usr/local/nginx-1.9.7/sbin/logCut.sh > /dev/null 2>&1
&等同于,1>可以省略成>
7、du -sh *
查看文件、目录占用磁盘空间大小
8、[ $? -eq 0 ]
如果命令执行成功(用作表示执行成功,例:输出执行成功提示echo"success do something!")
9、kill -USR1
发送一个USR1信号将导致以下步骤的发生:
停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改
(对重启服务器表示怀疑,本地用200并发测试本命令,未见到4××、5××,若不放心也可降级处理,不同机器采用不同执行时间,错开执行!)
示例1:
#!/bin/bash ##切割nginx日志 ##日志所在目录 nglogpath=/usr/local/nginx-1.9.7/logs ##nginx日志备份路径,备份前先检查路径,不存在则创建 backnglogpath=/usr/local/nginx-1.9.7/logs/backup if [ ! -d ${backnglogpath} ]; then mkdir -p ${backnglogpath} fi ##昨日日期 YESTERDAY=$(date -d "1 day ago" +"%Y%m%d") ##移动文件 mv ${nglogpath}/access.log ${backnglogpath}/access_${YESTERDAY}.log ##向nginx发送USR1信号,重新启动nginx日志 kill -USR1 $(cat /usr/local/nginx-1.9.7/logs/nginx.pid) ##压缩文件,删除源文件 zip -r ${backnglogpath}/access_${YESTERDAY}.zip ${backnglogpath}/access_${YESTERDAY}.log
rm -rf ${backnglogpath}/access_${YESTERDAY}.log ##删除15天前生成的文件(文件名匹配) #rm -rf ${backnglogpath}/access_$(date -d"15 day ago" +"%Y%m%d").zip ##删除15天之前生成的所有文件(文件生成日期+名称模糊搜索) find ${backnglogpath} -mtime +15 -type f -name 'access_*.zip' -exec rm -rf {} \; ##切割rocketmq日志 ##日志所在目录 mqlogpath=/data/taapp/applications/rocketmq_logs ##mq日志备份路径 backmqlogpath=/data/taapp/applications/rocketmq_logs/backup if [ ! -d ${backmqlogpath} ]
then mkdir -p ${backmqlogpath} fi ##移动文件、压缩、删除多余文件(文件存在则进行此操作) filepath=${mqlogpath}/rocketmq_log.1
##此处思路有误,虽然文件移走了,rocketmq client还是输出到原文件,合适做法是:保留三个文件,移走超过三个以上文件 if [ -f ${filepath} ]
then mv ${filepath} ${backmqlogpath}/rocketmq_${YESTERDAY}_log tar -zcvPf ${backmqlogpath}/rocketmq_${YESTERDAY}_log.tar.gz ${backmqlogpath}/rocketmq_${YESTERDAY}_log
rm -rf ${backmqlogpath}/rocketmq_${YESTERDAY}_log find ${backmqlogpath} -mtime +3 -type f -name 'rocketmq_*.tar.gz' -exec rm -rf {} \; fi
至此,ng、rocket_clinet日志完成切割、压缩、备份,日志滚动备份处理,限制日志磁盘使用空间。业务日志强时间相关度属性,决定随时间推移日志价值越小。但是数据总是宝贵的,可能只是你没来得及用上,转储是必不可少的。
3、es数据清理
es在上一篇做过介绍,非常强大的文件存储系统,运行一段时间给带来额外的麻烦,目前我们机器磁盘只有40G,收集的数据达到20G,任由增加将影响到应用运行。这本是一个中间件,刚开始思路需要某个属性设置数据有效期,比如30d,详细设置参照http://rockelixir.iteye.com/blog/1883373。
当然都没有找到我想要的,直到我把它当作数据库看待,柳暗花明又一村,在关系型数据库我们对待过期数据两种方式:1、转储 2、删除,关系型数据有DML语句支持,es也有lucene syntax支持,这里处理比较粗暴,直接删除了,其实也可转储,只是还用不上。
示例
#/bin/bash DELTIME=$(date -d "30 day ago" +%Y.%m.%d) DDAY=$(date -d "30 day ago" +%d) DMONTH=$(date -d "30 day ago" +%m) DYEAR=$(date -d "30 day ago" +%Y) CLOSETIME=$(date -d "15 day ago" +%Y.%m.%d) NOW=$(date) #del indic:es curl -XDELETE 10.10.6.1:9200/*-$DYEAR.$DMONTH.[1-$DDAY] curl -XDELETE 10.10.6.1:9200/*-$DYEAR.[1-$[DMONTH - 1]].* curl -XDELETE 10.10.6.1:9200/*-$[DYEAR-1].*.* #curl -XPOST 10.10.6.1:9200/*-$CLOSETIME/_flush #curl -XPOST 10.10.6.1:9200/*-$CLOSETIME/_close if [ $? -eq 0 ] then echo $NOW"-->del $DELTIME log success.." >> /data/software/elasticsearch-5.6.2/data/es-index-clear.log else echo $NOW"-->del $DELTIME log fail.." >> /data/software/elasticsearch-5.6.2/data/es-index-clear.log fi