ELK—>logstash—>ruby·plugin—>實現精彩的功能(term模板抽取)

#ELK—>logstash—>ruby·plugin—>實現精彩的功能(term模板抽取)

##效果展現mysql

抽取以前這樣出圖linux

抽取以前

抽取以後這樣出圖sql

抽取以後

甚至咱們以後還想出更花哨的圖~惟一的方式就是咱們去抽取索引(固然若是日誌自己是json格式的就能直接使用了)json

##抽取流程圖ruby

抽取流程圖

##日誌源 日誌源是這樣的————只列出幾條,做爲演示 2016-04-27 00:00:13,152 [INFO ] com.xxxxxxx.UserController - 用戶登陸成功, loginFrom:1, phoneNo:138 3838 4388微信

2016-04-27 00:00:14,791 [INFO ] com.xxxxxxx.UserController  - 用戶註冊成功, phoneNo:181 6777 8888, verificationCode:0001, registerFrom:   2

##需求 loginFrom 和 registerFrom 意思是從哪一個app端登陸的,後面的數字1和2 表明不一樣的app端。(注意,這裏咱們增長了難度,在registerFrom: 2 中加了幾個空格:到底幾個不重要,甚至數字字母也行) 好比在mysql中,表結構是這樣的app

table_name: channel
        id        name
        1        量化派
        2        阿里巴巴
        ...      ...
咱們要從日誌中,將loginFrom:1抽成 channelName:量化派;    將registerFrom:2抽成channelName:阿里巴巴;同時增長難度,抽取「用戶登陸成功」和「用戶註冊成功」字段,咱們稱之爲user_behavior(用戶行爲)
 
不知道你們能不能看透這樣作的好處————
    原本在kibana中可能要手工的去匹配每個filters,
    如今咱們只須要根據term一個簡單操做就搞定。

##0:precondition——ruby安裝 jdk ———— 1.8 logstash ———— 個人是2.0.0 ruby ———— 版本 > 1.9.3less

ruby建議直接源碼安裝,[點這兒下載](https://www.ruby-lang.org/en/downloads/)
    安裝步驟:
        ①tar zxvf xxx.tar.gz
        ②cd xxx————進入到解壓後的目錄
        ③./configure
        ④make && make install
    安裝完ruby,接着安裝ruby的包管理工具
        ⑤yum install rubygems
    而後安裝ruby的mysql連工具(先切換源,才能下載;ruby版本若是低於1.9.3,會安裝失敗)
        ⑥gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/
        ⑦gem install mysql2

##1:抽取——核心代碼 input { kafka { ... } }工具

filter {
        ...
        ruby{
        init => '[@kname](http://my.oschina.net/u/1384245) = ["channelName","userBehavior"];@pattern_behavior=eval(File.readlines("/opt/logstash-2.2.0/confs/rb/pattern.rb")[1]);@pattern_channel=eval(File.readlines("/opt/logstash-2.2.0/confs/rb/pattern.rb")[0]);@hashChannel=eval(File.readlines("/opt/logstash-2.2.0/confs/rb/hash_channel.rb")[0]);@hashUserBehavior=eval(File.readlines("/opt/logstash-2.2.0/confs/rb/hash_user_behavior.rb")[0]);'
        code => "event.append(Hash[@kname.zip(Array[@hashChannel[@pattern_channel.match(event['message']).to_a.compact[1]],@hashUserBehavior[@pattern_behavior.match(event['message']).to_a.compact[0]] ])]) if @pattern_channel.match(event['message'])"
        }
    }

    output {
        ...
    }

##2:自動化讀取crontab+ruby+mysql
你們應該注意到,上面的hash是去讀取文件的(最簡版@hashChannel={"1"=>"量化派","2"=>"阿里巴巴"}),爲何這樣呢?————假想 後期若是增加到一萬個你要手工 去每臺機器上去添加嗎。。。ui

①ruby 腳本

因此我寫了一個ruby腳本(爲何寫ruby腳本,由於logstash是用ruby寫的,這樣能保證一致性)
腳本很簡單,以下:(read_channel_from_mysql.rb)
    #導入須要的包
    require 'rubygems'
    require 'mysql2'
    #鏈接mysql
    client = Mysql2::Client.new(:host=>"127.0.0.1",:username=>"root",:password=>"123456",:database=>"database_name")
    results = client.query("select id,name from table_name");
    

    #計數
    count = results.count
    num = File.readlines("/opt/logstash-2.2.0/confs/rb/mysql_count.rb");
    _count = num[0].to_i

    if count != _count then
        #生成hash
        h = Hash.new
        results.collect do |row|
           h[row['id'].to_s]=row['name']
        end

        begin
            testFile = File.open("/opt/logstash-2.2.0/confs/rb/mysql_count.rb","w:UTF-8")
            testFile.write(count)
            #寫到文件,供logstash讀取
            file = File.open("/opt/logstash-2.2.0/confs/rb/hash_channel.rb","w:UTF-8")
            file.write(h)
        rescue IOError => e
        ensure
            testFile.close unless testFile.nil?
            file.close unless file.nil?
        end

        #重啓受影響的進程,我習慣配置supervisor的後臺管理,以爲好用
            `supervisorctl  -c /opt/supervisor/conf/supervisord.conf restart progromA`
            `supervisorctl  -c /opt/supervisor/conf/supervisord.conf restart progromB`
            `supervisorctl  -c /opt/supervisor/conf/supervisord.conf restart progromC`
    end

###②pattern配置 #/opt/logstash-2.2.0/confs/rb/pattern.rb /registerFrom:(\d+)|loginFrom:.+?(\d+)/ /用戶註冊成功|用戶登陸成功|send.+?sms.+?(succeed)/ ###③hash配置 /opt/logstash-2.2.0/confs/rb/hash_user_behavior.rb————手工配置 {nil=>"其餘","用戶註冊成功"=>"用戶註冊成功","用戶登陸成功"=>"用戶登陸成功",""succeed"=>"終審經過"} /opt/logstash-2.2.0/confs/rb/hash_channel.rb 這個是mysql直接讀出來了,就不貼了,格式和上面的同樣 ###④crontab 設置——crontab -e crontab是linux定時執行任務 基本格式 : *  *  *  *  *  command 分 時 日 月 周 命令 第1列表示分鐘1~59 每分鐘用*或者 */1表示 第2列表示小時1~23(0表示0點) 第3列表示日期1~31 第4列表示月份1~12 第5列標識號星期0~6(0表示星期天) 第6列要運行的命令

#每小時啓動一次~  根據本身須要來配置哦
    * 1 * * * /usr/local/bin/ruby /your/path/to/rb/read_channel_from_mysql.rb

###donation: 若有捐贈意向的朋友,請捐贈到支付寶帳號:qdcccc@gmail.com 帳戶名:楊春煉

###ask for help: 如需幫助,請加QQ:1028750558或微信:lian-ye

相關文章
相關標籤/搜索