Linux/Python学习论坛-京峰教育

 找回密码
 立即注册

一键登录:

搜索
热搜: 活动 交友 discuz
查看: 1360|回复: 0

shell-scripts,切割与上传nginx日志文件

[复制链接]

22

主题

69

帖子

2171

积分

金牌会员

Rank: 6Rank: 6

积分
2171
发表于 2015-7-27 22:47:14 | 显示全部楼层 |阅读模式
本帖最后由 kongzi68 于 2015-7-27 23:08 编辑

这个版本是目前的最新版
切割与上传日志文件,提供一种思路,相互共同学习,共同进步,若有好的想法,可以在帖子后面跟帖探讨噢
  1. #!/bin/bash
  2. #Cut and upload nginxlog
  3. #by colin
  4. #revision on 2015-07-08,09,10,07-22,07-27

  5. #7月22日检查脚本运行日志,发现若有文件在被更改,此时打包会失败
  6. #因此,创建了临时打包文件夹,把日志文件夹的内容拷贝到该目录下
  7. ############################
  8. #功能说明:该脚本运用于*****的nginxlog
  9. #sleep 20   #延时20秒运行
  10. scripts_run_log='/var/log/cron_scripts_run.log'
  11. echo "`date +%F" "%T":"%N` Now, The script $0 will runing..." >> ${scripts_run_log}

  12. ############################
  13. #这部分变量根据实际情况修改
  14. logs_path="/data/logs/www/"
  15. back_logs_path="/data/logs/backup/"
  16. log_name="m_nginx_access"
  17. nginx_pid_path="/var/run/nginx.pid"
  18. log_type="nginx"

  19. #define the ftp client
  20. lcd_dir="${back_logs_path}"
  21. cd_dir="/nginxlog/test"
  22. ############################

  23. nginx_pid=`cat ${nginx_pid_path}`
  24. T=`echo $(date +%k)|sed 's/ //g'`
  25. last_t_time=`date -d "1 hour ago" +%H`
  26. last_hour_time=`date -d "1 hour ago" +%Y-%m-%d-%H`
  27. last_date_time=`date -d "yesterday" +%Y-%m-%d`
  28. #last_week_time=`date -d "yesterday" +%w`

  29. #每小时切割与备份nginx生成的日志
  30. cd ${back_logs_path} && {
  31.         [ -f ${logs_path}${log_name}.log ] && mv ${logs_path}${log_name}.log ${log_name}_${last_t_time}.log || {
  32.                 echo "`date +%F" "%T":"%N` The ${logs_path}${log_name}.log is not exist..." >> ${scripts_run_log}
  33.                 exit
  34.                 }
  35.         [ -f ${log_name}_${last_t_time}.log ] && {
  36.                 #切割日志
  37.                 kill -USR1 ${nginx_pid}
  38.                 #追加切割后的日志到每天的日志记录文件中
  39.                 cat ${log_name}_${last_t_time}.log >> ${log_name}.log
  40.                 [ $? -eq 0 ] || cat ${log_name}_${last_t_time}.log >> ${log_name}.log
  41.                 #检测是否追加成功
  42.                 check_log=`stat ${log_name}.log |grep "Modify:"|awk '{print $3}'|awk -F: '{print $1}' |sed 's/^0//g'`
  43.                 if [ ${check_log} -eq ${T} ];then
  44.                         echo "`date +%F" "%T":"%N` The ${log_type}_log is cut successfully..." >> ${scripts_run_log}
  45.                 else
  46.                         echo "`date +%F" "%T":"%N` Cut the ${log_type}_log was failed, Please check..." >> ${scripts_run_log}
  47.                         exit
  48.                 fi
  49.                 }
  50.         #备份开发写的程序生成的日志
  51.         cp ${logs_path}m_wonaonao_record_${last_t_time}.log  .
  52.         #打包每小时的日志
  53.         tar_log_hour_name="${last_hour_time}.$(hostname).nginxlog.tar.gz"
  54.         tar -zcf ${tar_log_hour_name} ${log_name}_${last_t_time}.log m_wonaonao_record_${last_t_time}.log
  55.         if [ $? -eq 0 ] && [ -f ${tar_log_hour_name} ];then
  56.                 echo "`date +%F" "%T":"%N` Tar the ${tar_log_hour_name} is successfully in every hour..." >> ${scripts_run_log}
  57.         else
  58.                 echo "`date +%F" "%T":"%N` Tar ${log_type}_log of every hour was failed, Please check..." >> ${scripts_run_log}
  59.                 exit
  60.         fi
  61. }

  62. ##############################################
  63. #打包每天完整的日志
  64. #于2015年7月27日,修改为仅上传access与record的每天日志记录
  65. #定义临时打包文件夹
  66. temp_backup_dir="/tmp/tmp_www/${last_date_time}"
  67. [ ${T} -eq 0 ] && {
  68.         cd ${logs_path} && {
  69.         #创建临时打包文件夹,之前在日志目录下直接打包,会出现打包失败的情况
  70.         mkdir -p ${temp_backup_dir} && mv * ${temp_backup_dir}
  71.         #重建nginx日志文件
  72.         kill -USR1 ${nginx_pid}
  73.         #拷贝24个每小时的日志合并起来的一个整天的日志文件
  74.         cp ${back_logs_path}${log_name}.log ${temp_backup_dir}
  75.         #打包拷贝到临时打包文件夹的日志
  76.         tar_log_day_name="${last_date_time}.$(hostname).nginxlog.tar.gz"
  77.         tmp_tar_log_day_name="${back_logs_path}${tar_log_day_name}"
  78.         #cd到临时打包文件夹
  79.         cd ${temp_backup_dir} && {
  80.                 #tar -zcPf ${tmp_tar_log_day_name} .
  81.                 #上面的打包命令是打包这个目录下的所有文件
  82.                 #下面的命令于7月27日修改,仅仅打包m_wonaonao_access.log与m_wonaonao_record_*.log
  83.                 tar -zcPf ${tmp_tar_log_day_name} ${log_name}.log m_wonaonao_record_*.log
  84.                 if [ $? -eq 0 ] && [ -f ${tmp_tar_log_day_name} ];then
  85.                         : > ${back_logs_path}${log_name}.log     #前面打包后,这里清空这个日志
  86.                         #删除临时打包文件夹
  87.                         rm -rf ${temp_backup_dir}
  88.                         echo "`date +%F" "%T":"%N` Tar the ${tar_log_day_name} is successfully in every day..." >> ${scripts_run_log}
  89.                 else
  90.                         echo "`date +%F" "%T":"%N` Tar ${tar_log_day_name} of the whole day was failed, Please check..." >> ${scripts_run_log}
  91.                         exit
  92.                 fi
  93.                 }
  94.         }
  95. }

  96. ###########################################################
  97. #FTP循环上传代码段于2015-07-27修改
  98. ###########################################################
  99. ftp_err_dir="/tmp/ftp_err/"
  100. [ -d ${ftp_err_dir} ] || mkdir -p ${ftp_err_dir}
  101. ftp_err_log="${ftp_err_dir}ftp_temp_${log_type}_err.log"

  102. #FTP自动化上传函数
  103. function send_log(){
  104.         ftp -i -n 这里是IP地址 21 2>${ftp_err_log} << _EOF_
  105.         user 用户名 密码
  106.         passive
  107.         bin
  108.         lcd ${lcd_dir}
  109.         cd  ${cd_dir}
  110.         put $1
  111.         bye
  112. _EOF_
  113. #统计前面FTP运行输出的错误日志记录行数
  114. log_count=`cat ${ftp_err_log}|wc -l`
  115. [ ${log_count} -eq 0 ] && ftp_stat=0 || ftp_stat=1
  116. if [ ${ftp_stat} -eq 0 ];then
  117.     echo "`date +%F" "%T":"%N` Send : $1 to ftp_server was successfully." >> ${scripts_run_log}
  118.     return 0
  119. else
  120.     echo "`date +%F" "%T":"%N` Send : $1 more than $x time." >> ${scripts_run_log}
  121.     sleep 100
  122.     return 1
  123. fi
  124. }

  125. #根据计划任务,脚本每运行一次就执行一次
  126. [ -f "${back_logs_path}/${tar_log_hour_name}" ] && {
  127. x=1
  128. i=1
  129. until [ "$i" -eq 0 ];do
  130.     [ $x -gt 3 ] && {
  131.         echo "`date +%F" "%T":"%N` Send : ${tar_log_hour_name} to ftp_server was failed, Please check..." >> ${scripts_run_log}
  132.         break
  133.     }
  134.         send_log "${tar_log_hour_name}"
  135.     i=`echo $?`
  136.     x=`expr $x + 1`
  137. done
  138. }

  139. #零点的时候,发送上一天的完整日志
  140. [ "${T}" -eq 0 ] && [ -f "${back_logs_path}/${tar_log_day_name}" ] && {
  141. x=1
  142. i=1
  143. until [ "$i" -eq 0 ];do
  144.     [ $x -gt 3 ] && {
  145.         echo "`date +%F" "%T":"%N` Send : ${tar_log_day_name} to ftp_server was failed, Please check..." >> ${scripts_run_log}
  146.         break
  147.     }
  148.     send_log "${tar_log_day_name}"
  149.     i=`echo $?`
  150.     x=`expr $x + 1`
  151. done
  152. }

  153. #删除FTP产生的临时错误日志文件
  154. [ -f ${ftp_err_log} ] && rm ${ftp_err_log}
  155. #清理脚本运行日志记录/var/log/cron_scripts_run.log
  156. TEMP_WC=`cat ${scripts_run_log} |wc -l`
  157. if [ "${TEMP_WC}" -gt 10000 ];then
  158.         sed -i "1,5000d" ${scripts_run_log}
  159.     echo "`date +%F" "%T":"%N` Clean up the ${scripts_run_log}..." >> ${scripts_run_log}
  160.     echo "`date +%F" "%T":"%N` The script $0 run done." >> ${scripts_run_log}
  161. else
  162.     echo "`date +%F" "%T":"%N` The script $0 run done." >> ${scripts_run_log}
  163.     exit
  164. fi
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|京峰教育,只为有梦想的人 ( 京ICP备15013173号 )

GMT+8, 2019-4-25 01:59 , Processed in 0.030400 second(s), 17 queries , Apc On.

快速回复 返回顶部 返回列表