使用 ELK 搭建日記系統

海峽發表於2020-06-09

簡介

搭建日誌系統的目的主要為了在生產環境下能夠方便的檢視多個專案的實時日記,增加開發效率。特別是線上上多臺伺服器部署時候,不用在登入伺服器進入專案目錄,透過 tail -f 等命令來檢視日記了。

目標

  • 使用 ELK ( Elasticsearch、Logstash、Kibana ) 構建日記系統。
  • 實現多臺伺服器收集 Laravel 應用日記與 Nginx 日記。
  • Kibana 報表的展示日記資訊。

架構

Filebeat + Redis + ELK ( Elasticsearch、Logstash、Kibana )

使用ELK搭建日記

  1. Filebeat 從伺服器取日誌檔案並儲存到 Redis 中。
  2. Logstash 從 Redis 中取出日誌記錄,解析處理後並轉發到 Elasticsearch 中。
  3. Kibana 從 Elasticsearch 中讀取資料並展示。

    配置

    Filebeat

  • 安裝
    下載程式並安裝, 也可檢視 官網 教程
    deb:
    $ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.0-amd64.deb
    $ sudo dpkg -i filebeat-7.7.0-amd64.deb
    配置開機啟動:
    $ sudo systemctl enable filebeat
  • filebeat.yml 編輯配置檔案
    input 部分編輯
    $ vim /etc/filebeat/filebeat.yml
    filebeat.yml
.
.
.
filebeat.inputs:
- type: log
  paths:
    - /home/vagrant/code/laravel-shop/storage/logs/laravel.log
  multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
  multiline.timeout: 5s
  scan_frequency: 5s
  fields:
          index: 'laravel-log'


- type: log
  paths:
    - /var/log/nginx/deploy-laravel-shop-error.log

  multiline.pattern: '^[0-9]{4}/[0-9]{2}/[0-9]{2}'
  multiline.negate: true
  multiline.match: after
  multiline.timeout: 5s
  scan_frequency: 5s
  fields:
          index: 'deploy-laravel-shop-error.log'
.
.
.

path: 為日誌檔案路徑, 這裡收集了 laravel, nginx 日記。
multiline.pattern: 正規表示式,匹配日記與 2020-06-01 為開頭的記錄為同一條日記記錄。Filebeat 將所有不以 2020-06-01 開始的行與之前的行進行合併。
multiline.negatemultiline.match 配合使用。 multiline.pattern=^b 則以b開頭的行是一條完整日誌的開始,它和後面多個不以b開頭的行組成一條完整日誌。
multiline.timeout: timeout表示超時時間,如果超過timeout還沒有新的一行日誌產生,則自動結束當前的多行、形成一條日誌發出去。
scan_frequency: Filebeat以多快的頻率去prospector指定的目錄下面檢測檔案更新(比如是否有新增檔案),如果設定為0s,則Filebeat會盡可能快地感知更新(佔用的CPU會變高)。預設是10s。

Outputs 部份

.
.
.
#========================== Outputs ===============================

# Configure what output to use when sending the data collected by the beat.
#-------------------------- Redis output -------------------------------------
output.redis:
# Array of hosts to connect to.
        hosts: ["172.18.34.23:6379"]
        enabled: true
        db: "1"
        timeout: 5
        password: "123456"
        key: "%{[fields.index]:otherIndex}"

.
.
.

hosts: 為區域網 redis 伺服器的 ip.
key 為 redis 鍵值。
儲存檔案後重啟 filebeat

$ sudo systemctl restart filebeat

驗證 Filebeat 是否讀取資料成功
登入 redis 查詢是否有存在 key : laravel-log , deploy-laravel-shop-error .

$ redis-cli -h 172.18.34.23 -p 6379 
$ select 1
$ KEYS *
$ Llen laravel-log

使用 ELK 搭建日記
可以看到 KEY laravel-log, 且有 150485 條資料的存在。代表 Filebeat 執行成功。

Logstash

Logstash 從 Redis 中取出日誌記錄,解析處理後並轉發到 Elasticsearch 中。

安裝

$ curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.7.0.deb
$ sudo dpkg -i logstash-7.7.0.deb

新建資料流配置檔案

$ vim /etc/logstash/conf.d/laravel-log.conf
# 從redis將資料取出
input {
  redis {
    type => "laravel_log"
    host => "127.0.0.1"
    port => "6379"
    db => "1"
    data_type => "list"
    key => "laravel-log"
  }
}

# 格式化laravel日誌
filter {
   grok {
        match => [ "message","\[%{TIMESTAMP_ISO8601:logtime}\] %{WORD:env}\.(?<level>[A-Z]{4,5})\: %{GREEDYDATA:msg}" ]
        }
}

# 輸出到elasticsearch
output {
    elasticsearch {
        hosts => ["172.18.34.23:9200"]
        index => "laravel_log"
    }
}

grok 對是laravel 日記的格式化,按正規表示式的語法來寫的。
output 是 ES對應的配置, 在這裡 redis, ES 都在本機。

如果要配置nginx日記收集,只需與相同的方式在conf.d目錄新建
xxx.conf檔案

# nginx error grok 格式
filter {
   grok {
        match => [ "message","(?<time>\d{4}/\d{2}/\d{2}\s{1,}\d{2}:\d{2}:\d{2})\s{1,}\[%{DATA:err_severity}\]\s{1,}(%{NUMBER:pid:int}#%{NUMBER}:\s{1,}\*%{NUMBER}|\*%{NUMBER}) %{DATA:err_message}(?:,\s{1,}client:\s{1,}(?<client_ip>%{IP}|%{HOSTNAME}))(?:,\s{1,}server:\s{1,}%{IPORHOST:server})(?:, request: %{QS:request})?(?:, host: %{QS:client_ip})?(?:, referrer: \"%{URI:referrer})?" ]
        }
}

儲存後重啟.

$ sudo systemctl restart logstash.service

Elasticsearch

安裝

$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.9-linux-x86_64.tar.gz
$ tar -xvf elasticsearch-6.8.9-linux-x86_64.tar.gz

進入bin檔案啟動elasticsearch

$ cd elasticsearch-6.8.9/bin
$ ./elasticsearch

驗證Elasticsearch是否安裝成功

$ curl http://172.18.34.23:9200

成功資訊如下:
使用 ELK 搭建日記

Kibana

Kibana 讀取elasticsearch中的資料並展示成報表的形式。

安裝

注:需要注意Kibana的版本只能低於或等於ES的版本否則有可能 出錯。

下載並安裝

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.9-amd64.deb
$ shasum -a 512 kibana-6.8.9-amd64.deb 
$ sudo dpkg -i kibana-6.8.9-amd64.deb

配置kibana檔案

$ vim /etc/kibana/kibana.yml
.
.
.
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://172.18.34.23:9200"]
logging.dest: /var/log//kibana/kibana.log
i18n.locale: "zh-CN"
.
.
.

server.host設定成 0.0.0.0 是為了外網訪問。
i18n.locale: "zh-CN":設定kibana的語言為中文。
logging.dest設定日記檔案路徑,注意 如果目錄檔案不存需要自行建立目錄和檔案並且分配好許可權,否則kibana啟動失敗。

$ mkdir /var/log/kibana
$ touch /var/log/kibana/kibana.log
$ chown kibana:kibana /var/log/kibana/kibana.log

啟動kibana

$sudo systemctl start kibana

如果伺服器使用的是阿里雲則需要開啟 5601 埠。

使用 ELK 搭建日記系統

在瀏覽器中輸入http://IP:5601就可以訪問kibana

使用 ELK 搭建日記系統

Kibana 日記管理

建立日記空間
左側選單–>Default–>管理空間–>建立空間, 名稱為 Larave Log.

使用 ELK 搭建日記系統

建立完成後,切換到LL空間下

使用 ELK 搭建日記系統

建立日記索引
左側選單 管理–> Kibana/索引模式 在右側索引模式輸入laravel_log, 選擇下一步

使用 ELK 搭建日記系統

使用 ELK 搭建日記系統

使用 ELK 搭建日記系統

檢視日記報表
建立完成後點選 左側選單Discover會展示出我們統計的日記報表

使用 ELK 搭建日記系統

左側可選項可用來顯示日記要選擇的欄位。

ELK 日記系統配置完成。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章