通過shell和redis來實現叢集業務中日誌的即時收集分析

來源:互聯網
上載者:User

 

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131227/1T1113S9-0.png" />

在統計項目中,最難實施的就是日誌資料的收集。日誌分布在全國各個機房,而且資料量比較大,像rsync+inotify這種方式顯然不能滿足快速日誌同步的要求。 當然大家也可以用fluentd和flume採集日誌資料,除了這個我們也可以自己寫一套簡單的。

 

我寫的這個日誌分析系統 流程是:

 
  1. 1   在用戶端收集資料,然後通過redis pub方式把資料發給服務端 
  2.  
  3. 2   伺服器端是redis的sub    他會把資料統一存放在一個檔案,或者當前就過濾出來 

 

用戶端收集日誌的更新資料

 
  1. #!/bin/bash 
  2.  
  3. DATE=`date +%s` 
  4. LOGFILE=$1 
  5. if [ ! -f $1 ];then 
  6.  echo "LOG file did not give or it's not a file" 
  7. fi 
  8. sleep_time="2" 
  9.  
  10. count_init=`wc -l ${LOGFILE}|awk '{print $1}'` 
  11. while true 
  12. do 
  13. DATE_NEW=`date +%s` 
  14. #    DATE=$(date +%s) 
  15.     count_new=`wc -l ${LOGFILE}|awk '{print $1}'` 
  16.     add_count=$((${count_new} - ${count_init})) 
  17.     count_init=${count_new} 
  18.         if [ ! -n "${add_count}" ] 
  19.         then 
  20.             add_count=0 
  21.         fi 
  22.      QPS=$((${add_count}/${sleep_time})) 
  23.      info=`tail -n ${add_count} ${LOGFILE}`     
  24.      echo $info      
  25. #    我們可以把info這個值傳出去 
  26.      echo " Then QPS at `date -d "1970-01-01 UTC ${DATE_NEW} seconds" +"%Y-%m-%d %H:%M:%S"` is "${QPS} 
  27. #    echo " DATE_NEW: " $DATE_NEW " DATE_PLUS :" $DATE_PLUS 
  28. sleep $sleep_time 
  29. done 

 

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131227/1T111AH-1.png" />

把即時的日誌也列印出來

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131227/1T1116350-2.jpg" />

 

想傳到服務端,我們只需要在指令碼裡面加下面這命令就ok了~ 

/root/redis-bash-cli -h 10.10.10.61 PUBLISH rui "$info"

 

redis-bash-cli  這個是用戶端的指令碼,可以把資料publish過去

 
  1. #!/bin/bash   
  2. source /usr/share/redis-bash/redis-bash-lib 2> /dev/null  
  3. if [ $? -ne 0 ]; then  
  4.   LIBFOLDER=${0%/${0##*/}}  
  5.   source ${LIBFOLDER}/redis-bash-lib 2> /dev/null  
  6.   if [ $? -ne 0 ]; then  
  7.     echo "can't find redis-bash-lib in /usr/share/redis-bash or ${LIBFOLDER}"  
  8.     exit 127   
  9.   fi  
  10. fi  
  11. REDISHOST=localhost  
  12. REDISPORT=6379  
  13. REPEAT=1  
  14. DELAY=0  
  15. while getopts ":h:n:p:r:a:i:" opt  
  16. do  
  17.     case ${opt} in  
  18.         h) REDISHOST=${OPTARG};;  
  19.         n) REDISDB=${OPTARG};;  
  20.         p) REDISPORT=${OPTARG};;  
  21.         r) REPEAT=${OPTARG};;  
  22.         a) AUTH=${OPTARG};;  
  23.         i) DELAY=${OPTARG};;  
  24.     esac  
  25. done  
  26. shift $((${OPTIND} - 1))  
  27. if [ "${REDISHOST}" != "" ] && [ "${REDISPORT}" != "" ]  
  28. then  
  29.     exec 6<>/dev/tcp/${REDISHOST}/${REDISPORT} # open fd  
  30.     if [ $? -ne 0 ]; then  
  31.         exit 1  
  32.     fi  
  33. else  
  34.     echo "Wrong arguments"  
  35.     exit 255  
  36. fi  
  37. [ "${AUTH}" != "" ] && redis-client 6 AUTH ${AUTH} > /dev/null  
  38. [ "${REDISDB}" != "" ] && redis-client 6 SELECT ${REDISDB} > /dev/null  
  39. for ((z=1;z<=${REPEAT};z++))  
  40. do  
  41.     redis-client 6 "${@}"  
  42.     if [ $? -ne 0 ]; then  
  43.         exit 1  
  44.     fi  
  45.     [ ${DELAY} -gt 0 ] && sleep ${DELAY}  
  46. done  
  47. exec 6>&- #close fd  

 

Log Service端

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131227/1T1115196-3.png" />

 

redis-publish-test  這個是Log Service端,可以收到publish的資料

 

 
  1. #!/bin/bash   
  2. source /usr/share/redis-bash/redis-bash-lib 2> /dev/null  
  3. if [ $? -ne 0 ]; then  
  4.   LIBFOLDER=${0%/${0##*/}}  
  5.   echo $LIBFOLDER  
  6.   source ${LIBFOLDER}/redis-bash-lib 2> /dev/null  
  7.   if [ $? -ne 0 ]; then  
  8.     echo "can't find redis-bash-lib in /usr/share/redis-bash or ${LIBFOLDER}"  
  9.     exit 127   
  10.   fi  
  11. fi  
  12. REDISHOST=localhost  
  13. REDISPORT=6379  
  14. while getopts ":h:p:" opt  
  15. do  
  16.     case ${opt} in  
  17.         h) REDISHOST=${OPTARG};;  
  18.         p) REDISPORT=${OPTARG};;  
  19.     esac  
  20. done  
  21. shift $((${OPTIND} - 1))  
  22. while true  
  23. do  
  24.     exec 5>&-  
  25.     if [ "${REDISHOST}" != "" ] && [ "${REDISPORT}" != "" ]  
  26.     then  
  27.         exec 5<>/dev/tcp/${REDISHOST}/${REDISPORT} # open fd  
  28.     else  
  29.         echo "Wrong arguments"  
  30.         exit 255  
  31.     fi  
  32.     redis-client 5 SUBSCRIBE ${1} > /dev/null # subscribe to the pubsub channel in fd 5  
  33.     while true  
  34.     do  
  35.         unset ARGV  
  36.         OFS=${IFS};IFS=$'\n' # split the return correctly  
  37.         ARGV=($(redis-client 5))  
  38.         IFS=${OFS}  
  39.         if [ "${ARGV[0]}" = "message" ] && [ "${ARGV[1]}" = "${1}" ]  
  40.         then  
  41.         echo ${ARGV[2]}  
  42.         a=${ARGV[2]}  
  43.             echo $($a)  
  44.             echo "Message from pubsub channel: ${ARGV[2]}"  
  45.         elif [ -z ${ARGV} ]  
  46.         then  
  47.             sleep 1  
  48.             break  
  49.         fi  
  50.     done  
  51. done  

 

 

本文出自 “峰雲,就她了。” 部落格,請務必保留此出處http://rfyiamcool.blog.51cto.com/1030776/1191926

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.