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