簡介
搭建日誌系統的目的主要為了在生產環境下能夠方便的檢視多個專案的實時日記,增加開發效率。特別是線上上多臺伺服器部署時候,不用在登入伺服器進入專案目錄,透過 tail -f 等命令來檢視日記了。
目標
- 使用 ELK ( Elasticsearch、Logstash、Kibana ) 構建日記系統。
- 實現多臺伺服器收集 Laravel 應用日記與 Nginx 日記。
- Kibana 報表的展示日記資訊。
架構
Filebeat + Redis + ELK ( Elasticsearch、Logstash、Kibana )
- Filebeat 從伺服器取日誌檔案並儲存到 Redis 中。
- Logstash 從 Redis 中取出日誌記錄,解析處理後並轉發到 Elasticsearch 中。
- 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 部分編輯
filebeat.yml$ vim /etc/filebeat/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.negate
與 multiline.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
可以看到 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
成功資訊如下:
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 埠。
在瀏覽器中輸入http://IP:5601
就可以訪問kibana
Kibana 日記管理
建立日記空間
左側選單–>Default
–>管理空間–>建立空間, 名稱為 Larave Log.
建立完成後,切換到LL
空間下
建立日記索引
左側選單 管理–> Kibana/索引模式 在右側索引模式
輸入laravel_log
, 選擇下一步
檢視日記報表
建立完成後點選 左側選單Discover
會展示出我們統計的日記報表
左側可選項可用來顯示日記要選擇的欄位。
ELK 日記系統配置完成。
本作品採用《CC 協議》,轉載必須註明作者和本文連結