前言
本脚本用于将 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