nginx☞日志切割

阅读量: zyh 2020-05-14 09:34:44
Categories: > Tags:

前言

本脚本用于将 nginx 日志进行时间周期切割,并 lzo 压缩,最终上传到 s3。
脚本分为三个函数,切割函数,压缩上传函数,删除函数,需要执行哪个,就填写相对应变量。
详情可以看脚本注释。

请务必执行前,确认安装了 lzop 和 jq 命令 ,且机器是 aws EC2

脚本在此

#!/bin/bash
# by zyh
# time: 2019-12-13
# warning: 使用之前 yum install -y lzop jq

# crontab (执行时间周期需要和切割时间周期一致) 重要!!!!!!!
# */10 * * * * root bash /export/shell/nginxlog2s3/start.sh > /export/shell/nginxlog2s3/start.log 2>&1

# 标识日志名前缀
localtag=`curl -sq http://169.254.169.254/latest/dynamic/instance-identity/document/ | jq -r ."accountId",."availabilityZone",."privateIp" | sed 'N;N;s@\n@_@g'`

# ----------------------------------人为变量填写开始区域----------------------------------
# 切割时间周期,定位切割后日期的初始写入时间(仅适用于连续切割,且不适用于第一次切割)
todaytime=$(date -d "-10 mins" +%Y%m%d)
todayhour=$(date -d "-10 mins" +%H)
todaytimestr=$(date  -d "-10 mins" +%s)

# 企业微信机器人
wx_api=''

# nginx 日志目录 logs 所在路径, 备份日志目录是 logs/logsbak
# 例如日志目录是 /usr/local/nginx/logs,则填写 /usr/loca/nginx, 则切割后本地备份路径是 /usr/local/nginx/logs/logsbak
nginx_base=

# 日志位于S3的根路径,例如 s3://xxx/logs/xxxdays/nginx
S3Base=""

# MvLogList="a.log b.log c.log"  需要切割的日志,这是必须的
MvLogList=""

# LzopS3LogList="a.log b.log c.log" 需要压缩并上传S3的日志,如果你需要执行此步骤
# S3目录格式:${S3Base}/${日志名}/${todaytime}/${todayhour}/ 
LzopS3LogList=""

# DeleteLocalLog="a.log b.log c.log" 需要本地设置保留时间的日志,如果你需要执行此步
DeleteLocalLog=""

# 本地保存时间
deletetime=$(date -d "72 hours ago" +%s)

# ----------------------------------人为变量填写结束区域----------------------------------

# 日志原始路径
nginx_logs="${nginx_base}/logs"
# 日志位于本地的切割后备份路径
backup_logs="${nginx_logs}/logsbak"
[[ -d ${backup_logs} ]] || mkdir -p ${backup_logs}
# nginx pid 文件路径
nginx_pid="${nginx_logs}/nginx.pid"
[[ -f ${nginx_pid} ]] || {
  echo "${nginx_pid} is not exist!!!!" && exit
}

mvlog(){
  [[ -z $1 ]] && continue
  NginxLogName=$1
  [[ -d ${backup_logs}/${NginxLogName} ]] || mkdir -p ${backup_logs}/${NginxLogName}
  mv ${nginx_logs}/${NginxLogName} ${backup_logs}/${NginxLogName}/${localtag}_${NginxLogName}_${todaytime}${todayhour}_${todaytimestr} && echo "MV: ${nginx_logs}/${NginxLogName} to ${backup_logs}/${NginxLogName}/${localtag}_${NginxLogName}_${todaytime}${todayhour}_${todaytimestr}"
}
lzops3log(){
  [[ -z $1 ]] && continue
  NginxLogName=$1
  S3Path=$2
  cd ${backup_logs}/${NginxLogName}
  lzop ${localtag}_${NginxLogName}_${todaytime}${todayhour}_${todaytimestr} && aws s3 cp ${localtag}_${NginxLogName}_${todaytime}${todayhour}_${todaytimestr}.lzo ${S3Path}/${todaytime}/${todayhour}/ --quiet && rm -rf ${localtag}_${NginxLogName}_${todaytime}${todayhour}_${todaytimestr}.lzo && echo "UPLOAD: ${localtag}_${NginxLogName}_${todaytime}${todayhour}_${todaytimestr}.lzo to ${S3Path}/${todaytime}/${todayhour}/" || curl "$wx_api" -H 'Content-Type: application/json' -d '{"msgtype": "markdown","markdown": {"content": "# `'"${localtag}_${NginxLogName}_${todaytime}${todayhour}_${todaytimestr}.lzo"'` 日志上传失败!!!!!!"}}'
}
deletelocallog(){
  [[ -z $1 ]] && continue
  NginxLogName=$1
  cd ${backup_logs}/${NginxLogName}
  for logname in `ls`;do
    if [[ ${deletetime} -ge ${logname##*_} ]];then
      rm -rf ${logname} && echo "DELETE: ${backup_logs}/${NginxLogName}/${localtag}_${NginxLogName}_${deletetime}"
    fi
  done
}

#MV
for i in ${MvLogList};do
  mvlog ${i}
done
#nginx log reload
kill -USR1 `cat ${nginx_pid}`
#lzop and to s3
for i in ${LzopS3LogList};do
  lzops3log ${i} ${S3Base}/${i}
done
#Delete
for i in ${DeleteLocalLog};do
  deletelocallog ${i}
done