##效果展現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腳本,由於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