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


   先結果導向,來看我在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之后,登陸就會有用戶名密碼驗證了。

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM