先結果導向,來看我在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之後,登陸就會有使用者名稱密碼驗證了。
好了,本篇就說這麼多,希望對你有幫助。