记得刚进公司的时候,我主要从事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脚本方便。