使用kibana視覺化報表實時監控你的應用程式,從日誌中找出問題,解決問題

一線碼農發表於2018-06-13

   先結果導向,來看我在kibana dashborad中製作的幾張監控圖。

 

一:先睹為快

dashboard1:監控幾個維度的日誌,這麼點日誌量是因為把無用的清理掉了,而且只接入了部分應用。

          <1>  每日日誌總數。

          <2>  每日日誌錯誤數,從log4net中level=ERROR摳出來的。

          <3>  每個應用貢獻的日誌量(按照應用程式分組)

          <4>  今日錯誤日誌時間分佈折線圖。

          <5>  今日全量日誌時間分佈折線圖。

   

dashboard2:這個主要用來監控某日智慧精準觸發的簡訊數和郵件數以及通道佔比情況。

 

dashboard3: 某日傳送的營銷活動概況,一目瞭然。

 

        

二:採集注意事項

      接下來我們聊聊這個流程中注意的問題。

 

1.  使用fileBeat 清洗掉垃圾日誌

      採集端使用的是filebeat,一個應用程式配置一個prospectors探測器。

#=========================== Filebeat prospectors =============================

filebeat.prospectors:

# Each - is a prospector. Most options can be set at the prospector level, so
# you can use different prospectors for various configurations.
# Below are the prospector specific configurations.



################## 1. IntelligentMarketing.Service3  ##################
- 
  enabled: true
  paths:
    D:\Services\channel3\log\*.log
  exclude_lines: ['^----------','重新排隊,暫停 100。$']
  fields:
    appname: IntelligentMarketing.Service3
    ipnet: 10.153.204.199
    ippub: 121.41.176.41
  encoding: gbk
  multiline.pattern: ^(\s|[A-Z][a-z]|-)
  multiline.match: after


################## 2. IntelligentMarketing.Service4  ##################
- 
  enabled: true
  paths:
    D:\Services\channel4\log\*.log
  exclude_lines: ['^----------','重新排隊,暫停 100。$']
  fields:
    appname: IntelligentMarketing.Service4
    ipnet: 10.153.204.199
    ippub: 121.41.176.41
  encoding: gbk
  multiline.pattern: ^(\s|[A-Z][a-z]|-)
  multiline.match: after

 

《1》 exclude_lines

            這個用來過濾掉我指定的垃圾日誌,比如說以 ----------- 開頭的 和  “重新排隊,暫停100。”結尾的日誌,反正正則怎麼用,這裡就怎麼配吧,有一點注意,

儘量不要配置 contain模式的正則,比如: '.*暫未獲取到任何mongodb記錄*.'   這樣會導致filebeat cpu爆高。

 

《2》 fields

        這個用於配置應用程式專屬的一些資訊,比如我配置了appname,內網ip,外網ip,方便做後期的日誌檢索,檢索出來就是下面這樣子。

    

 

《3》 multiline

         有時候應用程式會拋異常,就存在著如何合併多行資訊的問題,我這裡做的配置就是如果當前行是以‘空格’,‘字母‘ 和 ‘-’開頭的,那麼就直接合併到上

一行,比如下面這個Mongodb的FindALL異常堆疊。

 

2. logstash解析日誌

      主要還是使用 grok 正則,比如下面這條日誌,我需要提取出‘date’,‘threadID’,和 “ERROR” 這三個重要資訊。

2017-11-13 00:00:36,904 [65] ERROR [xxx.Monitor.Worker:83] Tick [(null)] - 這是一些測試資料。。

   那麼就可以使用如下的grok模式。

match => { "message" => "%{TIMESTAMP_ISO8601:logdate} \[%{NUMBER:threadId}\] %{LOGLEVEL:level}"}

   

    上面這段話的意思就是:提取出的時間給logdate,65給threadId,ERROR給level,然後整個內容整體給預設的message欄位,下面是完整的logstash.yml。

input {
    beats {
       port => 5044
    }
}

filter {
    grok {
          match => { "message" => "%{TIMESTAMP_ISO8601:logdate} \[%{NUMBER:threadId}\] %{LOGLEVEL:level}"}
    }
    if ([message] =~ "^----------") {
      drop {}
    }
    date {
        match => ["logdate", "yyyy-MM-dd HH:mm:ss,SSS"]
      # target => "@timestamp"
        timezone => "Asia/Shanghai"
    }
    ruby {
       code => "event.timestamp.time.localtime"
    }
}

output {
  stdout {
   codec => rubydebug { }
  }

   elasticsearch {
       hosts => "10.132.166.225"
       index => "log-%{+YYYY.MM.dd}"
   }
  
}       

 

 

三: kibana製作

 1. 今日全量日誌吞吐走勢圖

 

這個比較簡單。因為本質上是一個聚合計算,aggreration按照 Date Histogram聚合即可。

 

2. 今日錯誤日誌走勢圖

 

  這個相當於在上面那個按時間聚合分組之後,然後在每一個bucket中再做一個 having level=‘ERROR’的篩選即可。

 

3. 今日普通營銷活動傳送

  這個就是在bucket桶中做了一個  having message like '%【第四步】 leaflet傳送成功%'  ,為什麼這麼寫是因為只要傳送成功,我都會追加這麼一條日誌,

所以大概就是這麼個樣子,效能上大家應該也知道,對吧。

 

4. 今日應用程式日誌吞吐量

 

    這個不想上面那三張圖按照時間聚合,而是按照appname 聚合就可以了,還記得我在filebeat的fileld中新增的appname欄位嗎?

 

四:使用nginx給kibana做許可權驗證

  為了避開x-pack 的複雜性,大家可以使用nginx給kibana做許可權驗證。

1.  安裝 yum install -y httpd-tools。

 

2. 設定使用者名稱和密碼:admin abcdefg

htpasswd -bc /data/myapp/nginx/conf/htpasswd.users damin  abcdefg

3. 修改nginx的配置。

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
        #access_log  logs/host.access.log  main;

       auth_basic "Restricted Access";
       auth_basic_user_file /data/myapp/nginx/conf/htpasswd.users;      #登入驗證
       location / {

           proxy_pass http://10.122.166.225:5601;     #轉發到kibana
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_cache_bypass $http_upgrade;
           allow 222.68.71.185;  #允許的IP
           allow 118.133.47.76; #允許的IP
           deny all;
       }

 

4. 重啟nginx

[root@localhost conf]# /data/myapp/nginx/sbin/nginx -s reload

 

然後繫結域名到你的ip之後,登陸就會有使用者名稱密碼驗證了。

 

好了,本篇就說這麼多,希望對你有幫助。

 

相關文章