日志切割与转储

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

 

  

posted @ 2018-01-18 21:37  walkyou  阅读(388)  评论(0编辑  收藏  举报