基于elk+filebeat的日志采集與分析

1 問題

1.1 場景1

用戶服務與訂單服務部署在同一機子不同目錄,一次下單流程設計用戶服務與訂單服務,但下單過程拋異常,為了定位異常(哪個服務產生的?具體代碼行數?),要分別打開用戶服務所在目錄,查看各自的日志文件,然后定位問題。

1.2 場景2

由于業務壓力,訂單服務有多個實例,分別部署在多個不同服務器上,一次下單流程失敗,確定由訂單服務引起,為了定位異常,需要查看日志,但是由于負載均衡,無法確定該異常是哪臺服務器打印的,因此只能逐一登錄服務器,進行一一查看。

1.3 綜述

場景1和場景2是分布式應用在日志采集上遇到的普遍問題,因為應用的分散,日志也被分散在不同服務器的不同目錄上,這給開發定位問題帶來了極大的不便。


2 解決方案

2.1 傳統方案

2.1.1 手動查看

逐一登錄服務器,然后執行命名監聽日志文件,該方案費時費力,效率較為低下

tail -f trade.log

2.1.2 寫數據庫

需在主業務庫外新建一套輔庫,寫入日志文件,日志寫入可有以下幾種方式,該方案侵入性較強,大量的日志輸出日志庫,日志庫可能存在瓶頸,從而影響到業務。

  • 代碼或aop寫入日志(不推薦,侵入性強);
  • 日志框架配置輸出到數據庫(同樣存在侵入性,當日志庫掛掉,服務無法正常啟動)。

2.2 elk

elk由elasticsearch、logstash和kibana三部分組件組成,官網https://www.elastic.co/cn/

  • elasticsearch:搜索引擎,主要用來存儲日志文件,可單機,可集群
  • logstash:日志采集、過濾工具,主要采集日志,然后格式化,過濾后存儲到elasticsearch
  • kibana:可視化的web平臺日志分析工具,主要用來分析elasticsearch上的日志

該方案的優點是,業界成熟的方案,性能高,方便后續的日志統一分析和查詢,但缺點在于日志框架配置強依賴與elk,即日志框架配置中必須配置elk的部分,才能輸出日志到elk,侵入性較強。

2.3 elk+filebeat

  • filebeat:輕量級開源日志文件數據搜集器
  • 工作流圖


    enter image description here

    該方案的彌補了單elk的缺點,無項目配置的侵入。


3 環境搭建

本次搭建的elk版本統一為5.6.4版本,下載地址https://www.elastic.co/downloads/past-releases

3.1 elasticsearch搭建

  • 下載
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.4.zip
unzip elasticsearch-5.6.4.zip
mv elasticsearch-5.6.4 elasticsearch
cd elasticsearch
  • 啟動
./bin/elasticsearch -d
  • 查看網絡狀態,驗證服務啟動
netstat -tunpl
mark
  • 使用elasticsearch-head插件查看


    mark

3.2 logstash搭建

  • 下載
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.6.4.zip
unzip logstash-5.6.4.zip
mv logstash-5.6.4 logstash
cd logstash
  • 配置文件
vi config/logstash.conf
#輸入
input {
    beats {
            port => 5044
    }
}

#過濾
filter {
    #nginx 日志過濾
    if "nginx-accesslog" in [tags] {
        grok {
                match => { "message" => "%{HTTPDATE:timestamp}\|%{IP:remote_addr}\|%{IPORHOST:http_host}\|(?:%{DATA:http_x_forwarded_for}|-)\|%{DATA:request_method}\|%{DATA:request_uri}\|%{DATA:server_protocol}\|%{NUMBER:status}\|(?:%{NUMBER:body_bytes_sent}|-)\|(?:%{DATA:http_referer}|-)\|%{DATA:http_user_agent}\|(?:%{DATA:request_time}|-)\|"}
        }
        mutate {
                convert => ["status","integer"]
                convert => ["body_bytes_sent","integer"]
                convert => ["request_time","float"]
        }
        geoip {
                source=>"remote_addr"
        }
        date {
                match => [ "timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
        }
        useragent {
                source=>"http_user_agent"
        }
    }
    
    #logback日志過濾
    if "sys-messages"  in [tags] {
        grok {          
                match => {"message" => "%{DATA:timestamp} %{LOGLEVEL:level} \[%{DATA:class} :%{INT:line}\] %{DATA:log_message}" }
        }
        date {  
                match =>  [ "timestamp", "MMM  d HH:mm:ss" ]
        }
    }
    
    #log4j2過濾
    if "gateway-messages"  in [tags] {
        grok {
                match => {"message" => "%{DATA:timestamp} \[%{DATA:log_pid}\] %{LOGLEVEL:level}- %{DATA:log_message}" }
        }
        date {
                match =>  [ "timestamp", "MMM  d HH:mm:ss" ]
        }
    }
}

#輸出
output {
    elasticsearch {
        hosts => ["192.168.10.210:9200"]
        index => "logstash-%{type}-%{+YYYY.MM.dd}"
        document_type => "%{type}"
    }
    stdout { codec => rubydebug }
}
  • 啟動
./bin/logstash -f ./config/logstash.conf > /dev/null 2>&1 &
  • 查看端口,驗證服務已啟動
netstat -tunpl
mark

3.4 kibana搭建

  • 下載
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.4-linux-x86_64.tar.gz
tar -zxvf kibana-5.6.4-linux-x86_64.tar.gz
mv kibana-5.6.4-linux-x86_64 kibana
cd kibana
  • 配置
vi ./config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.10.210:9200"
  • 啟動
./bin/kibana > /dev/null 2>&1 &
  • 驗證服務
netstat -tunpl
mark

3.5 filebeat搭建

  • 下載
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.4-linux-x86_64.tar.gz
tar -zxvf filebeat-5.6.4-linux-x86_64.tar.gz
mv filebeat-5.6.4-linux-x86_64 filebeat
cd filebeat
  • 配置
filebeat.prospectors:
- input_type: log
  paths:
    - /opt/release/nginx/logs/access.log
  tags: ["nginx-accesslog"]
  document_type: nginxaccess
output.logstash:
  hosts: ["192.168.10.210:5044"]
  • 啟動
./filebeat > /dev/null 2>&1 &
  • 驗證
ps aux|grep filebeat
mark

4 使用

4.1 采集nginx日志

  • nginx日志配置
    log_format  main $time_local | $remote_addr | $http_host | $http_x_forwarded_for | $request_method | $request_uri | $server_protocol | $status | $body_bytes_sent | $http_referer | $http_user_agent | $request_time |;
  • nginx filebeat配置
filebeat.prospectors:
- input_type: log
  paths:
    - /opt/release/nginx/logs/access.log
  tags: ["nginx-accesslog"]
  document_type: nginxaccess
output.logstash:
  hosts: ["192.168.10.210:5044"]

4.2 采集java日志

filebeat.prospectors:
#log4j2配置
- input_type: log
  paths:
    - /home/openapi/out.log
    - /home/citizen/trade/out.log
  tags: ["gateway-messages"]
  document_type: gatewaymessages
  multiline.pattern: '^[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}'
  multiline.negate: true
  multiline.match: after
#logback配置
- input_type: log
  paths:
    - /data/logs/*/*.log
  tags: ["sys-messages"]
  document_type: sysmessages
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
#輸出logstash
output.logstash:
  hosts: ["192.168.10.210:5044"]

4.3 采集效果

4.3.1 nginx日志收集與分析

mark

mark

4.3.2 java日志收集與分析

mark

5 引用

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容