改进工作流程

    技术2022-05-18  23

    记得刚进公司的时候,我主要从事web方面的工作,查看日志非常重要,我们的系统打印出日志文件格式如下:

    (由于公司保密原则,其中隐去一些重要的信息)

    %%%%%% <一些特殊的标识A> | <一些特殊的标识B> | <一些有意义的信息> | <一些有意义的信息> | <一些重要的信息如此条sql的执行时间> %%%%%%%

    SELECT  staff_name FROM staff

     

    因为在同一时间,会有很多员工操作我们的系统,此时日志文件会产生大量的信息,我们想捕获与自己操作相关的日志信息就成为了一个问题,

    在此之前想要解决此问题主要靠两方面:

    1、使用tail -f sql.log ,crt客户端刷屏后,快速的执行你的操作,然后切屏后ctrl+c,此时就是希望在自己执行的同时别人没有操作系统。

    2、根据自己的经验和知识,执行你的操作后,ctrl+c,找到属于自己本次操作的日志。

    很明显这两种方法都存在问题。

    当时我想,是不是有什么方法可以代替这个tail -f sql.log 操作,让每个用户只看到自己的sql日志信息。

    假设:<一些特殊的标识A>是客户端的ip地址,然后我想到是否可以根据此标识截取与用户自己相关的信息,最终我选择使用shell脚本,对tail 命令进行加工,具体如下:

    v_date="sqllog.20"

    v_year=`date +%y`

    v_month=`date +%m`

    v_day=`date +%d`

    v_middle="-"

    v_postfix=".log"

    v_filename=$v_date$v_year$v_middle$v_month$v_middle$v_day$v_postfix

     

    v_ipaddress=`who am i -a| awk '{print $8}'`

     

    if [ -d fileneirong_temp ]

    then 

        :

    else

    `mkdir fileneirong_temp`

    fi

     

    if [ -f fileneirong_temp/$v_ipaddress ]

    then 

        :

    else

    `touch fileneirong_temp/$v_ipaddress`

    fi

     

    size_old=`wc -l $v_filename|awk  '{print $1 }'`

    while [ 1==1 ]; do

    size_new=`wc -l $v_filename|awk  '{print $1 }'`

    if [ $size_new -gt $size_old ] 

    then

       size=$(($size_new - $size_old))

    `tail -n $size  $v_filename | perl -pi -e 's//*/%/g'  >fileneirong_temp/$v_ipaddress`

    v_temp=""

    v_temp_1=""

    v_temp_2="1"

    v_temp_3="i"

    while read LINE

          do

              v_temp=`echo $LINE | grep '[0-9]/{1,3/}/.[0-9]/{1,3/}/.[0-9]/{1,3/}/.[0-9]/{1,3/}' `

               if [ -n v_temp ] && [ "$v_temp" != "" ] || [ "$v_temp_2" != "" ]

          then

                       v_temp_1=`echo $LINE | grep "$v_ipaddress" `

                       if [ -n v_temp_1 ] && [ "$v_temp_1" != "" ] &&  [ "$v_temp_3" != "" ]

                          then

                             echo $LINE

                            #  echo $line_temp

                             v_temp_2=""

                             v_temp_3="ii"

                          else

                             v_temp_2="i" 

                       fi 

              else 

                              echo $LINE

               fi

       done < fileneirong_temp/$v_ipaddress

    fi

    size_old=$size_new

    done

    `rm -f fileneirong_temp/$v_ipaddress`

    exit 0

    (这是我第一次写shell脚本,可能有很大的改进空间,欢迎大家指正)

    一般情况下,此脚本都是可以执行的,唯一可能经常要修改的就是:

    v_ipaddress=`who am i -a| awk '{print $8}'`

    此处可能要根据主机操作系统的不同,改变此v_ipaddress变量的获取方法,我当时的想法是此标识由用户自己输入,

    在我发出这个脚本后,我的一个同事提到了可以客户端自己来进行获取,这是我刚进公司1个月的时候写的脚本,现在已经工作近两年了,记得当时科长还表扬了,现在回忆起来心里蛮开心的。

    特此与大家分享一下,没有什么技术含量,主要是分享一下心得。工作中一定不能埋头苦干,要思考,要学会利用自己已经掌握的知识来解决当前遇到的问题。同时在解决问题的时候一定要把握度,因为我也在这个日志截取器(就这么叫这个shell脚本了)上犯了个错误,我当时想进一步扩展,直接使用java+flex,使用java来执行此shell脚本,然后把shell脚本的执行结果返回给java,然后java再返回给flex前端,最终虽然实现了,但是确实没有什么价值,不如大家在crt中使用这个shell脚本方便。


    最新回复(0)