1. 程式人生 > 實用技巧 >ELK Stack 介紹 & Logstash 日誌收集

ELK Stack 介紹 & Logstash 日誌收集

ELK Stack 組成

Software Description Function
E:Elasticsearch Java 程式 儲存,查詢日誌
L:Logstash Java 程式 收集、過濾日誌
K:Kibana Java 程式 提供 Web 服務,將資料頁面化
F:Filebeat Go 程式 收集、過濾日誌

ELK Stack 功能

收集: 收集所有伺服器的日誌

傳輸: 把日誌穩定的傳輸到 ES 或者其他地方

儲存: ES 能有效快速的儲存日誌資料

分析: 通過 Web 頁面分析資料

監控: 監控叢集架構

ELK Stack 優點

處理方式靈活:Elasticsearch 是實時全文索引,具有強大的搜尋功能

配置相對簡單:Elasticsearch 全部使用 JSON 介面,Logstash 使用模組配置,Kibana 的配置檔案部分更簡單。

檢索效能高效:基於優秀的設計,雖然每次查詢都是實時,但是也可以達到百億級資料的查詢秒級響應。

叢集線性擴充套件:Elasticsearch 和 Logstash 都可以靈活線性擴充套件

前端操作絢麗:Kibana 的前端設計比較絢麗,而且操作簡單

ELK Stack 用途

#=========== 收集所有的日誌 ===========#
### 收集 Web 服務日誌
### 收集服務日誌
### 收集系統日誌

#============ 統計、分析 =============#
### 統計訪問量
### 統計訪問量前 10 的 IP
### 站點訪問次數最多的 URL
### 查詢一上午以上三個值
### 查詢一下午以上三個值
### 對比一下上下午使用者訪問量
### 對比這一週,每天使用者增長還是減少

部署 ElasticSearch(走你

部署 Kibana(走你

部署 Logstash

安裝 Java 環境

[root@web01 ~]# rpm -Uvh jdk-8u181-linux-x64.rpm

伺服器時間同步

[root@web01 ~]# ntpdate time1.aliyun.com

安裝 Logstash

# 上傳
[root@web01 ~]# rz logstash-6.6.0.rpm

# 安裝
[root@web01 ~]# rpm -ivh logstash-6.6.0.rpm

# 授權,已經授權
[root@web01 ~]# chown -R logstash.logstash /usr/share/logstash/

# 啟動命令(需要指定配置檔案等引數)
/usr/share/logstash/bin/logstash

Logstash 初識

輸入輸出外掛介紹

# INPUT、OUTPUT 外掛
INPUT:外掛使 Logstash 收集指定源的日誌
OUTPUT:外掛將事件資料傳送到特定的目的地
INPUT 支援事件源 OUTPUT 支援輸出源 CODEC 編解碼器支援編碼
azure_event_hubs(微軟雲事件中心) elasticsearch(搜尋引擎資料庫) avro(資料序列化)
beats(filebeat日誌收集工具) email(郵件) CEF(嵌入式框架)
elasticsearch(搜尋引擎資料庫) file(檔案) es_bulk(ES中的bulk api)
file(檔案) http(超文字傳輸協議) Json(資料序列化、格式化)
generator(生成器) kafka(基於java的訊息佇列) Json_lines(便於儲存結構化)
heartbeat(高可用軟體) rabbitmq(訊息佇列 OpenStack) line(行)
http_poller(http api) redis(快取、訊息佇列、NoSQL) multiline(多行匹配)
jdbc(java連線資料庫的驅動) s3*(儲存) plain(純文字,事件間無間隔)
kafka(基於java的訊息佇列) stdout(標準輸出) rubydebug(ruby語法格式)
rabbitmq(訊息佇列 OpenStack) tcp(傳輸控制協議)
redis(快取、訊息佇列、NoSQL) udp(使用者資料報協議)
s3*(儲存)
stdin(標準輸入)
syslog(系統日誌)
tcp(傳輸控制協議)
udp(使用者資料報協議)

Logstash 輸入輸出測試

# 配置環境變數
[root@web01 ~]# vim /etc/profile.d/logstash.sh
export PATH=/usr/share/logstash/bin/:$PATH

# 收集標準輸入到標準輸出測試
[root@web01 ~]# logstash -e 'input { stdin {} } output { stdout {} }'

# 測試輸入
123456
{
	# 時間戳
    "@timestamp" => 2020-08-13T01:34:24.430Z,
      # 主機
      "host" => "web01",
      # 版本
      "@version" => "1",
      # 內容
      "message" => "123456"
}

# 收集標準輸入到標準輸出指定格式
[root@web01 ~]# logstash -e 'input { stdin {} } output { stdout { codec => rubydebug } }'
123456
{
       "message" => "123456",
      "@version" => "1",
    "@timestamp" => 2020-08-13T01:39:40.837Z,
          "host" => "web01"
}

Logstash 收集標準輸入到檔案

# 收集標準輸入到檔案
[root@web01 ~]# logstash -e 'input { stdin {} } output { file { path => "/tmp/test.txt" } }'

# 收集標準輸入到檔案
[root@web01 ~]# logstash -e 'input { stdin {} } output { file { path => "/tmp/test_%{+YYYY-MM-dd}.txt" } }'

Logstash 收集標準輸入到 ES

# 收集標準輸入到ES
[root@web01 ~]# logstash -e 'input { stdin {} } output { elasticsearch { hosts => ["10.0.0.51:9200"] index => "test_%{+YYYY-MM-dd}" } }'

# 隨便輸入些內容

# 檢視頁面

Logstash 使用

Logstash 是一個開源的資料收集引擎,可以水平伸縮,而且 Logstash 整個 ELK Stack 當中擁有最多外掛的一個元件,其可以接收來自不同來源的資料並統一輸出到指定的且可以是多個不同目的地

Logstash 配置檔案

# 預設的配置檔案
/etc/logstash/logstash.yml

# 一般不使用,只有 Systemd 管理時預設使用,但 Systemd 啟動 Logstash 會有許多坑

收集檔案日誌到檔案

編輯配置檔案

[root@web01 ~]# vim /etc/logstash/conf.d/message_file.conf
input {
  file {
    path => "/var/log/messages"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}
output {
  file {
    path => "/tmp/message_file_%{+YYYY-MM-dd}.log"
  }
}

指定配置啟動

# 檢測配置(速度和啟動一樣慢)
[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_file.conf -t

# 啟動
[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_file.conf

檢視是否生成檔案

[root@web01 tmp]# ll
total 4
-rw-r--r-- 1 root root 1050 Aug 13 11:24 message_file_2020-08-13.log

收集檔案日誌到 ElasticSearch

編輯配置檔案

[root@web01 ~]# vim /etc/logstash/conf.d/message_es.conf
input {
  file {
    path => "/var/log/messages"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}
output {
  elasticsearch {
    hosts => ["10.0.0.51:9200","10.0.0.52:9200","10.0.0.53:9200"]
    index => "message_es_%{+YYYY-MM-dd}"
  }
}

指定配置啟動

[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_es.conf

檢視是否生成索引資料

用 ES-Head 觀察是否生成索引資料,若資料收整合功,Kibana 也可以新增該索引模板,收集 ElasticSearch 中的日誌資料

Logstash 多例項收集日誌

建立多個數據目錄

[root@web01 ~]# mkdir /data/logstash/{message_file,message_es} -p
# 授權
[root@web01 ~]# chown -R logstash.logstash /data/

指定資料目錄啟動

# 指定配置檔案,以及資料目錄
[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_es.conf --path.data=/data/logstash/message_es &
[1] 18693
[root@web01 ~]# logstash -f /etc/logstash/conf.d/message_file.conf --path.data=/data/logstash/message_file &
[2] 18747

## logstash 更多選項可以觀察命令幫助

驗證檔案以及索引資料

觀察檔案是否生成,觀察 ElasticSearch 資料庫中是否有新的索引和文件

Logstash 單例項收集多份日誌

收集日誌到檔案

# 編輯配置檔案
[root@web01 ~]# vim /etc/logstash/conf.d/more_file.conf

input {
  file {
    type => "messages_log"
    path => "/var/log/messages"
    start_position => "beginning"
  }
  file {
    type => "secure_log"
    path => "/var/log/secure"
    start_position => "beginning"
  }
}
output {
  if [type] == "messages_log" {
    file {
      path => "/tmp/messages_%{+YYYY-MM-dd}"
    }
  }
  if [type] == "secure_log" {
    file {
      path => "/tmp/secure_%{+YYYY-MM-dd}"
    }
  }
}

收集日誌到 ElasticSearch

[root@web01 conf.d]# cat nginx_tomcat.conf
input {
  file {
    type => "nginx_log"
    path => "/var/log/nginx/access.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
  file {
    type => "tomcat_log"
    path => "/usr/local/tomcat/logs/localhost_access_log.*.txt"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}

output {
  if [type] == "nginx_log" {
    elasticsearch {
      hosts => ["10.0.0.121:9200"]
      index => "nginx_%{+YYYY-MM-dd}"
    }
  }
  if [type] == "tomcat_log" {
    elasticsearch {
      hosts => ["10.0.0.121:9200"]
      index => "tomcat_%{+YYYY-MM-dd}"
    }
  }
}