ELK日志分析系統初體驗

1 ELK技術棧

1.0 官方文檔

ELK

logstash

elasticsearch

kibana

ELK技術棧要點總結

1.1 Logstash技術

1.1.1 What is Logstash

Logstash is an open source data collection engine with real-time pipelining capabilities. Logstash can dynamically unify data from disparate sources and normalize the data into destinations of your choice. Cleanse and democratize all your data for diverse advanced downstream analytics and visualization use cases.

1.1.2 Logstash的工作原理

1.1.3 Logstash安裝與使用

1.1.3.1 安裝教程

官方文檔之安裝教程

Mac第三方工具安裝

$ brew install logstash

1.1.3.2 使用教程

********啟動命令********

$ bin/logstash -f logstash-example.conf

Logstash根據logstash-example.conf配置文件對數據源進行數據讀取和清洗,并將清洗結果寫入指定的目標文件。

logstash命令除了可以使用“-f”指定配置文件外,還可以指定其他參數,具體說明可以參見官方文檔之Command Flags

Logstash除了通過命令行參數進行配置外,還可以在logstash.yml等setting文件中進行設置,具體說明參見官方文檔之Setting files

配置文件

input { 
 ...      #Input Plugin處理數據輸入
}
filter {
 ...      #Filter Plugin對數據進行清洗,為完成清洗目標,有時需要多個filter
}
output {
  ...       #Output Plugin將格式化數據輸出到指定目標文件
}

配置文件結構清晰,但所涉及的插件種類繁多,而且在插件使用過程中還涉及環境變量使用條件語句使用等內容。用戶可根據需要選擇適當的插件和語法實現數據收集和清洗的目標。

1.1.4 Logstash的技術要點

##1.2 Elasticsearch****技術

1.2.1 What is Elasticsearch

Elasticsearch is a highly scalable open-source full-text search and analytics engine. It allows you to store, search, and analyze big volumes of data quickly and in near real time. It is generally used as the underlying engine/technology that powers applications that have complex search features and requirements.

1.2.2 核心概念

****Cluster****與****Node****

****Index****、****Type****與****Document****

****Shards****與****Replicas****

1.2.3 配置與使用

********啟動命令********

$ bin/elasticsearch 前端方式啟動
$ bin/elasticsearch -d 守護進程方式啟動
elasticsearch啟動比較簡單,也額外創建配置文件,它將收集的數據重新編排存儲,以支持數據的全文檢索。檢索是Elasticsearch最為重要的功能,也是最為復雜的語法。

********需要注意的是:********elasticsearch不支持在root用戶下啟動,因此,在啟動前,用戶需要創建非root用戶,并為該用戶賦予elasticsearch目錄的操作權限,詳情參見https://my.oschina.net/topeagle/blog/591451?fromerr=mzOr2qzZ

********配置管理********
Elasticsearch一般不需額外配置,但是為了提高Elasticsearch性能可以通過elasticsearch.yml文件修改配置參數。當然,也可以根據用戶系統配置降低配置參數,如jvm.heapsize。Elasticsearch默認占用2G內存,對于系統配置較低的服務器,很可能帶來負載過大的問題,因此需要適當減少jvm.heapsize。

1.2.4 數據檢索

Elasticsearch提供大量的API支持檢索服務,用戶甚至可以根據需要定制化分析器映射器.

1.2.5 Elasticsearch技術要點

##1.3 Kibana****技術

1.3.1 What is Kibana

Kibana is an open source analytics and visualization platform designed to work with Elasticsearch. You use Kibana to search, view, and interact with data stored in Elasticsearch indices. You can easily perform advanced data analysis and visualize your data in a variety of charts, tables, and maps.
Kibana makes it easy to understand large volumes of data. Its simple, browser-based interface enables you to quickly create and share dynamic dashboards that display changes to Elasticsearch queries in real time.

1.3.2 安裝與配置

********安裝********
參見官方教程,值得注意的是Kibana與Elasticsearch版本要保持一致。

********啟動********

$ bin/kibana      //前臺(foreground)啟動方式
$ bin/kibana&     //守護進程啟動方式

********配置********
Kibana配置可以通過命令行參數或配置文件kibana.yml。Kibana應用的默認地址為localhost,無法從遠程訪問Kibana,因此,用戶需要修改配置文件的server.host屬性。

1.3.3 使用教程

********數據檢索********


(1)時間篩選:限定檢索的時間范圍



(2)index pattern:限定檢索的數據范圍
(3)字段篩選:限定特殊字段以及特殊字段值
(4)搜索框:采用Elasticsearch檢索語法查詢


********數據分析********
數據分析是Elasticsearch與Kibana的核心模塊,Elasticsearch提供分析功能,kibana提供圖形渲染功能。

數據分析需要涉及Elasticsearch的AggregationMappingAnalysis和Kibana的VisualizeDashboard等模塊,內容相對比較復雜,用戶可根據實際需要適當選擇。

Kibana的Visualize是基于Elasticsearch聚合結果進行圖形化展示,支持AreaChart、DataTable、PieChart等圖表結構。Dashboard則是將多個visualize綜合展示,并配注markdown記錄,形成完整的數據分析報告。


1.3.4 Kibana技術要點

#2 ****日志分析系統
##2.1 ****基于阿里云****NAS****的日志分析系統架構設計

********日志生成:********對于Java和Node應用,分別采用Logback與winston日志框架生成日志,注意,日志采用json格式單行存儲(一行json對應一條日志)

********日志存儲:********分布式應用的日志采用NAS統一存儲,減少因日志分散保存而帶來數據收集的高復雜度。

********日志收集與清洗:********基于Logback的Pipeline功能,從NAS讀取日志數據,并通過 filter插件進行日志的格式化清洗,并將清洗結果傳送到Elasticsearch。

********日志重排與存儲:********Elasticsearch將收集的數據進行重排,以支持符合elasticsearch檢索語法。并將重排數據予以保存,同事可以通過集群、分片(Shards、Replicas)等進行冗余存儲。

********日志分析與檢索:********通過Elasticsearch Search API即可檢索與分析數據,但基于命令行的分析可視化不夠,借助Kibana可以將日志分析與檢索采用圖形化、列表化的方式予以展現,提高數據的可讀性。

##2.2 ****日志收集

2.2.1 Logstash配置文件

input { 
  file {
    path => "/mnt/test/lease/be-lease-core/logs/sys*.log"
    start_position => "beginning"
    type => "demo_core"
  }
  file {
    path => "/mnt/test/lease/be-platform-admin/logs/sys*.log"
    start_position => "beginning"
    type => "boss"
  }
  file {
    path => "/mnt/test/lease/be-sso-config-hub/logs/sys*.log"
    start_position => "beginning"
    type => "sso"
  }
}

filter { 
  json {
    source => "message"
  }
  mutate {
    rename => { "message" => "log_message" }
  }
  json {
    source => "log_message"
  }
  geoip {
    source => "remoteIP"
  }
}

output {
 elasticsearch { 
    hosts => ["localhost:9200"] 
    index => "lease-on-cloud"
 } 
}

2.2.2 Logstash配置文件分析

********(****1****)**** Input****部分********

file {
    path => "/mnt/test/lease/be-lease-core/logs/sys*.log"
    start_position => "beginning"
    type => "demo_core"
}

采用file插件收集NAS日志收據,path指定日志存放地址,采用通配符指定多個文件。

為了便于日志的Archive,以及標識產生日志的應用容器,日志文件采用“log+hostname”方式命名,因此,同一類日志可能會存在多個日志文件。

start_position指定從日志文件Start位置開始收集,file插件默認從End位置收集,只會收集Logstash啟動后生成的日志。

type標識日志類型,對于微服務應用,我們借助type區分應用類型,以方便日后檢索與問題定位。

********(****2****)**** Filter****部分********

filter { 
  json {
    source => "message"
  }
  mutate {
    rename => { "message" => "log_message" }
  }
  json {
    source => "log_message"
  }
  geoip {
    source => "remoteIP"
  }
}

filter的配置需要根據日志格式和清洗目標按需定制,在我們的項目中,日志采用json格式,其中message key對應的value又是json對象的字符串,因此在提取json key-value時需要做兩次json過濾。

{
    "@timestamp": "2017-01-11T21:23:31.266+08:00",
    "@version": 1,
    "message": "{\"messageType\":\"HTTP_REQUEST\",\"method\":\"POST\",\"remoteIP\":\"172.19.0.6\",\"remotePort\":37404,\"requestContentType\":\"multipart/form-data; boundary=----WebKitFormBoundaryPERZDPTHqXa44MD6\",\"requestUrl\":\"/boss/Api/StandardService/findAllService\",\"timestamp\":1484141011266,\"userId\":0}",
    "logger_name": "com.amarsoft.platform.common.filter.SystemLoggingFilter",
    "thread_name": "qtp1641808846-17",
    "level": "DEBUG",
    "level_value": 10000,
    "HOSTNAME": "8753bfd90a1e-be-platform-admin-default-be-platform-admin-1",
    "SYS_ERROR": "sys-error",
    "SYS_INFO": "sys-info",
    "SYS_HIBERNATE": "sys-hibernate",
    "SYS_MYBATIS": "sys-mybatis",
    "SYS_FILTER": "sys-filter",
    "RemoteIP": "83.149.9.216"
}

Logstash默認每條日志為message key的value,因此第一個json是對一條完整日志進行篩選,將json轉換為一個個鍵值對。轉換后,并不能將日志message字段對應的json對象拆分提取,因此需要再使用json插件過濾。由于完整日志對應的message key與日志內message key,二次使用json時Logstash會認為對完整日志進行過濾,為此需要對 message進行重命名,這時采用mutate插件完成。

********注意:********filter插件比較多,也比較復雜,用戶可以根據自己需要按需選擇。
##2.3 ****日志分析(檢索)

2.3.1 確定分析目標

(1)時間范圍:按照日、周、月、年度分別統計分析
(2)應用比較:各類應用的使用頻繁程度比較,結合監控數據判斷每類應用耗用資源情況等
(3)API分析:各類請求接口的使用情況分析,哪類API使用頻繁,各API的響應時間如何

2.3.2 數據分析

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容