处理nginx站点日志的shell脚本

nginx站点中access和error使用的都是默认的日志格式,日志文件命名如下:

www.xxxx.com.access.log

www.xxxx.com.error.log

脚本每天处理前一天的日志记录,将日志重新放在压缩文件中,并按月份存放,如下:

201611/www.xxxx.com.access.20161102.log.zip

201611/www.xxxx.com.error.20161102.log.zip

脚本如下:

#!/bin/bash
# Description: deal nginx access and error log daily

yes_day_A=`date +%d/%b/%Y -d -1day`
yes_day_A1=`date +%d"\/"%b"\/"%Y -d -1day`
yes_day_E=`date +%Y/%m/%d -d -1day`
yes_day_E1=`date +%Y"\/"%m"\/"%d -d -1day`
yes_day=`date +%Y%m%d -d -1day`
mon=`date +%Y%m`

file_list=`find /etc/nginx/ -type f -name "*.conf" -print0 | xargs -0 egrep ‘^(\s|\t)*access_log|error_log‘|awk ‘{print $3}‘|tr ";" " "|tr ‘\n‘ ‘ ‘`

for file in $file_list
do
        site=`echo $file |awk -F"log$" ‘{print $1}‘`
        count=0
        if [ -f $file ];then
                echo "Log file found:$file"
                path=`dirname $file`
                cd $path && find ./ -name "*[0-9].log.zip" -mtime +30 -delete
                test ! -d $mon && mkdir $mon
                
                if [[ $file =~ .*acc.* ]];then
                        date_fmt="\[$yes_day_A:"
                        date_str="\[$yes_day_A1:"
                        echo -e "\taccess_file:$file"
                        #continue
                elif [[ $file =~ .*err.* ]];then
                        date_fmt="^$yes_day_E"
                        date_str="^$yes_day_E1"
                        echo -e "\terror_file:$file"
                        #continue
                fi
                
                dst_file="${site}${yes_day}.log"
                grep "$date_fmt" $file >$dst_file
                [ $? -ne 0 ] && let count=count+1
                sleep 5
                
                dfile_size=`ls -l $dst_file |awk ‘{print $5}‘`
                if [ $dfile_size -gt 1024 ];then
                        zip -m -r ${dst_file}.zip $dst_file
                        mv ${dst_file}.zip $mon/
                elif [ $dfile_size -le 10 ];then
                        rm -f $dst_file
                else
                        mv $dst_file $mon/
                fi
              
                [ $? -ne 0 ] && let count=count+1
                sleep 5
                
                if [ $count -eq 0 ];then
                        sed -i "/$date_str/d" $file
                        sed -i "/^$/d" $file
                fi
        fi
done

nginx -t
[ $? -eq 0 ] && nginx -s reload

其中遇到一个坑:sed命令删除文件,是将要删除的内容临时放在当前目录下一个以sed开头的文件中,再删除源文件内容,最后删除临时文件。如果中间出现异常(临时文件导致磁盘空间不足),会终止删除操作,源文件不变,临时文件也不自动处理。

时间: 2024-10-17 14:54:46

处理nginx站点日志的shell脚本的相关文章

nginx日志切割shell脚本

#!/bin/bash #function:cut nginx log files shell #cp /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access.log.bak log_cut_path="/var/log/nginx" log_files_path="/usr/local/nginx/logs/" log_files_dir=${log_cut_path}$(date -d &quo

自动发送密码抓取远程日志用Shell脚本如何实现?

在linux系统中,如何用shell脚本抓取远程日志?分析线上的日志会有一个困境,机器太多,如果每台都登录上去看不太现实,但是下载下来更麻烦因为每台SCP都要求输入密码.于是我便写了一个自动抓取远程日志的脚本,实现在基本功能. 代码: #!/usr/bin/expect -f if { $argc !=1 && $argc !=2 } {send_user "没有输入远程日志文件名.\n"send_user "格式是:get.sh ${remote_log}

自动清除过期的Tomcat日志的shell脚本

(友好提示:本文属于初级shell编程,高手可忽略此文) 在产品环境运行过程中,每天会切割产生按天计的日志文件,这些日志文件一般在过一定期限以后就没什么用处了,因此需要定期删除掉这些过期的日志文件.本文以CentOS下的Tomcat为应用环境基础,通过shell脚本的方式定时自动删除过期的Tomcat日志文件,以减少磁盘空间的占用.减轻管理员的日常工作. 一.shell脚本代码: #!/bin/bash # # filename: clearExpiredTomcatLogs.sh # # FU

nginx 日志切割 shell脚本

# ######  My  Shell Code ############# #! /bin/bashdate=`date +%Y%m%d`logpt=/root/nginx/logs/access.loglogbk=/data/ng_log/$datelogpid=/root/nginx/logs/nginx.pidlogtag=$logbk/`date +%Y%m%d%H%m%S`if test ! -d $logbk;then mkdir -p $logbk;fitest -f $logp

Apache日志切割shell脚本

Apache.Nginx等web服务器日志量巨大,如果不进行切割的话会导致日志文件过大,不容易清理,而且给日志分析收集工作带来麻烦.下例为Apache日志切割脚本,nginx等其他web服务同样适用 代码: #!/bin/bash apache_log_path="/usr/local/apache/logs"     #指定日志存储位置 log_filenames=`/bin/ls $apache_log_path` save_days=7  #定义保留7天内日志 #按照日期时间存储

tomcat 日志切割shell脚本

vim tomcat_cut.sh #!/bin/bash log_path=/opt/tomcat8080/logs d=`date +%Y-%m-%d` d4=`date -d'30 day ago' +%Y-%m-%d` cd ${log_path} && cp catalina.out $log_path/catalina.out.$d.log echo > catalina.out rm -rf $log_path/catalina.out.${d4}.log # chmo

常见的一些shell脚本书写,定时删除,压缩备份

删除与备份videoportal日志 写执行删除过期日志的shell脚本 以下参考文档:https://blog.csdn.net/yuan882696yan/article/details/77885339 执行删除 /home/test/REPORT/send/videoportal23890234823904.txt这个目录下文档(当前是保留五天日志) 定时任务执行这个目录下的shell脚本:   /home/myshell/test.sh  (需要进行赋权操作chmod +x test.

企业生产环境shell脚本案例分享

1)Mysql数据库备份脚本(完整备份+异地备份) 一般Mysql数据库备份会采用在MYSQL从库上执行全量备份+增量备份方式.在从库备份避免Mysql主库备份的时候锁表造成业务影响. #!/bin/bash set -e #当脚本有错误时,便停止执行脚本 #备份的数据库名 DATABASES=( "magedu01" "magedu02" ) USER="root" PASSWORD="dbpwd123" MAIL=&quo

Linux下添加shell脚本使得nginx日志每天定时切割压缩

Linux下添加shell脚本使得nginx日志每天定时切割压缩一 简介 对于nginx的日志文件,特别是access日志,如果我们不做任何处理的话,最后这个文件将会变得非常庞大 这时,无论是出现异常时查日志,还是使用"GoAccess"等工具对日志进行分析都将会变得非常麻烦.因此,每天定时对nginx日志进行切割压缩就非常有必要了 二 实现 我的实现思路是每天晚上接近12点时定时执行脚本.其脚本内容就是将当前的nginx日志先按照当天日期进行重命名接着进行压缩,最后是新建空白的ngi