一、ELK介紹
1.1、ELK簡介
ELK是Elasticsearch、Logstash、Kibana三大開源架構首字母大寫簡稱(但是後期出現的filebeat(beats中的一種)可以用來替代logstash的資料收集功能,比較輕量級)。市面上也被成為Elastic Stack。
Filebeat是用于轉發和集中日志資料的輕量級傳送工具。Filebeat監視您指定的日志檔案或位置,收集日志事件,并将它們轉發到Elasticsearch或 Logstash進行索引。Filebeat的工作方式如下:啟動Filebeat時,它将啟動一個或多個輸入,這些輸入将在為日志資料指定的位置中查找。對于Filebeat所找到的每個日志,Filebeat都會啟動收集器。每個收集器都讀取單個日志以擷取新内容,并将新日志資料發送到libbeat,libbeat将聚集事件,并将聚集的資料發送到為Filebeat配置的輸出。
Logstash是免費且開放的伺服器端資料處理管道,能夠從多個來源采集資料,轉換資料,然後将資料發送到您最喜歡的“存儲庫”中。Logstash能夠動态地采集、轉換和傳輸資料,不受格式或複雜度的影響。利用Grok從非結構化資料中派生出結構,從IP位址解碼出地理坐标,匿名化或排除敏感字段,并簡化整體處理過程。
Elasticsearch是Elastic Stack核心的分布式搜尋和分析引擎,是一個基于Lucene、分布式、通過Restful方式進行互動的近實時搜尋平台架構。Elasticsearch為所有類型的資料提供近乎實時的搜尋和分析。無論您是結構化文本還是非結構化文本,數字資料或地理空間資料,Elasticsearch都能以支援快速搜尋的方式有效地對其進行存儲和索引。
Kibana是一個針對Elasticsearch的開源分析及可視化平台,用來搜尋、檢視互動存儲在Elasticsearch索引中的資料。使用Kibana,可以通過各種圖表進行進階資料分析及展示。并且可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以彙總、分析和搜尋重要資料日志。還可以讓海量資料更容易了解。它操作簡單,基于浏覽器的使用者界面可以快速建立儀表闆(dashboard)實時顯示Elasticsearch查詢動态
1.2、為什麼要使用ELK
日志主要包括系統日志、應用程式日志和安全日志。系統運維和開發人員可以通過日志了解伺服器軟硬體資訊、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日志可以了解伺服器的負荷,性能安全性,進而及時采取措施糾正錯誤。
往往單台機器的日志我們使用grep、awk等工具就能基本實作簡單分析,但是當日志被分散的儲存不同的裝置上。如果你管理數十上百台伺服器,你還在使用依次登入每台機器的傳統方法查閱日志。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日志管理,例如:開源的syslog,将所有伺服器上的日志收集彙總。集中化管理日志後,日志的統計和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux指令能實作檢索和統計,但是對于要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
一般大型系統是一個分布式部署的架構,不同的服務子產品部署在不同的伺服器上,問題出現時,大部分情況需要根據問題暴露的關鍵資訊,定位到具體的伺服器和服務子產品,建構一套集中式日志系統,可以提高定位問題的效率。
二、ELK部署
elk各個元件的網址可以在官網下載下傳:https://www.elastic.co/cn/
或者在中文社群下載下傳:https://elasticsearch.cn/download/
注:本次安裝都是采用壓縮包的方式安裝
2.1 安裝Elasticsearch
2.1.1準備工作
#建立資料目錄和日志檔案
mkdir -p /data/elk/data
mkdir -p /data/elk/log
#修改主機名
hostnamectl set-hostname elk
#修改屬性權限
chown -R elasticsearch:elasticsearch /data/elk/
2.1.2安裝jdk
rpm -ivh jdk-8u151-linux-x64.rpm
echo "export JAVA_HOME=/usr/java/jdk1.8.0_151" >> /etc/profile
echo "export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /etc/profile
echo "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profile
source /etc/profile
2.1.3安裝Elasticsearch
unzip elk-package.zip
rpm -ivh elasticsearch-7.7.1-x86_64.rpm
ip=ifconfig | sed -n 2p | awk '{print $2}'
echo "$ip elk" >> /etc/hosts
安裝完成修改etc/elasticsearch/elasticsearch.yml
vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk
node.name: elk //最好跟主機名一緻
path.data: /data/elk/data
path.logs: /data/elk/data
network.host: 本地ip
http.port: 9200
cluster.initial_master_nodes: ["elk"] //選擇master
systemctl start elasticsearch.service
啟動檢視端口:
三、部署Elasticsearch叢集
3.1以同樣的方式部署另一台Elasticsearch
rpm -ivh jdk-8u151-linux-x64.rpm
echo "export JAVA_HOME=/usr/java/jdk1.8.0_151" >> /etc/profile
echo "export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /etc/profile
echo "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profile
source /etc/profile
mkdir -p /data/elk/data
mkdir -p /data/elk/log
hostnamectl set-hostname elk_2
chown -R elasticsearch:elasticsearch /data/elk/
unzip elk-package.zip
rpm -ivh elasticsearch-7.7.1-x86_64.rpm
ip=ifconfig | sed -n 2p | awk '{print $2}'
echo "$ip elk_2" >> /etc/hosts
注意node節點不能一樣,上面已經有elk節點了
node.name: elk
可以取node.name: elk_2
安裝完成修改/etc/elasticsearch/elasticsearch.yml
cluster.name: elk
node.name: elk_2 //最好跟主機名一緻
path.data: /data/elk/data
path.logs: /data/elk/data
network.host: 本地ip
http.port: 9200
discovery.seed_hosts: ["elk", "elk_2"] //種子節點master宕了可以變成新的master
cluster.initial_master_nodes: ["elk"] //選擇master
在每一個節點的配置檔案結尾都加上這行
http.cors.enabled: true
http.cors.allow-origin: "*"
修改master節點的配置檔案加上
discovery.seed_hosts: ["elk", "elk_2"]
每一個節點的/etc/hosts加上其他節點的A記錄解析
192.168.xxx.xxx elk_2
192.168.xxx.xxx elk
啟動成功後安裝/先在master上裝
wget https://nodejs.org/dist/v14.16.0/node-v14.16.0-linux-x64.tar.xz
tar -xf node-v14.16.0-linux-x64.tar.xz
mv node-v14.16.0-linux-x64 /usr/local/node
配置環境變量
echo "export NODE_HOME=/usr/local/node/" >>/etc/profile
export "PATH=$NODE_HOME/bin:$PATH" >>/etc/profile
source /etc/profile
rz F:\linux軟體包 elasticsearch-head-master.zip
unzip elasticsearch-head-master.zip
cd elasticsearch-head-master/
npm install //編譯
npm install phantomjs-[email protected].1.14 --ignore-scripts //報錯了就輸入這個繼續編譯
nohup npm run start & 守護方式啟動
http://192.168.204.91:9100/
登入驗證看是否正常顯示。
四、安裝LogStash
需要采集日志的節點都裝
rpm -ivh logstash-7.7.1.rpm
ln -s /usr/share/logstash/bin/logstash /bin/做個軟連接配接
測試 是否正常 第二次停的時候輸入字元看是否傳回ok
logstash -e 'input { stdin { } } output { stdout {} }'
五、安裝Kinaba
rpm -ivh kibana-7.7.1-x86_64.rpm
#修改配置
vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "192.168.204.3"
#和master節點建立連接配接
elasticsearch.hosts: ["http://192.168.204.91:9200"]
kibana.index: ".kibana"
i18n.locale: "zh-CN"
啟動
systemctl start kibana
systemctl status kibana
http://192.168.204.3:5601/到浏覽器檢視情況
六、日志收集
6.1使用LogStash進行簡單的采集資料
寫配置檔案
vim /etc/logstash/conf.d/elk.conf
[[email protected]_2 usr]# cat /etc/logstash/conf.d/elk.conf
input {
file {
path =>"/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output{
elasticsearch {
hosts => ["192.168.204.91:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
檢測配置檔案是否正确
/usr/share/logstash//bin/logstash -f /etc/logstash/conf.d/elk.conf -t
啟動
/usr/share/logstash//bin/logstash -f /etc/logstash/conf.d/elk.conf
systemctl start logstash.service
到http頁面檢視是否有資料
6.2日志過濾
加入一些判斷條件對日志進行過濾
logStansh配置檔案/使用if判斷過濾
input {
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
file {
path => "/var/log/secure"
type => "secure"
start_position => "beginning"
}
}
output {
if [type] == "system" {
elasticsearch {
hosts => ["192.168.1.202:9200"]
index => "nagios-system-%{+YYYY.MM.dd}"
}
}
if [type] == "secure" {
elasticsearch {
hosts => ["192.168.1.202:9200"]
index => "nagios-secure-%{+YYYY.MM.dd}"
}
}
}
http://192.168.204.3:5601/到浏覽器檢視情況
添加索引,索引對應/etc/logstash/conf.d/elk.conf裡設定的索引
6.3 搜集nginx日志
6.3.1将nginx配置檔案把日志輸出資訊改成json格式
http {
include mime.types;
default_type application/octet-stream;
log_format main '{ "time_local": "$time_local", '
'"remote_addr": "$remote_addr", '
'"referer": "$http_referer", '
'"request": "$request", '
'"status": $status, '
'"bytes": $body_bytes_sent, '
'"agent": "$http_user_agent", '
'"x_forwarded": "$http_x_forwarded_for", '
'"up_addr": "$upstream_addr",'
'"up_host": "$upstream_http_host",'
'"upstream_time": "$upstream_response_time",'
'"request_time": "$request_time" }';
access_log logs/access.log main;
6.3.2 修改收集日志的配置檔案
echo /etc/logstash/conf.d/elk.conf
input {
file {
path =>"/var/log/messages"
type => "system"
stat_interval => 2
start_position => "beginning"
}
file {
path =>"/usr/local/nginx/logs/access.log"
type => "nginx"
start_position => "beginning"
}
}
filter {
if [type] == "nginx" {
grok{
match => {"message" => "%{IPV4:my_ip}"}
}
}
}
output{
if [type] == "system" {
elasticsearch {
hosts => ["192.168.204.91:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
if [type] == "nginx" {
elasticsearch {
hosts => ["192.168.204.91:9200"]
index => "nginx-%{+YYYY.MM.dd}"
}
}
}
6.3.3 清空nginx原有的日志檔案
添加完需要把nginx原有的配置檔案備份,然後清空,否則可能出錯
echo > /usr/local/nginx/log/nginx.log
6.3.4 收集關鍵字段
取出 message 中的 IP位址,建立 “my_ip” 字段并将位址存入字段中
filter {
if [type] == "nginx" {
grok{
match => {"message" => "%{IPV4:my_ip}"}
}
}
}
6.4、tomcat日志改json
6.4.1将tomcat配置檔案把日志輸出資訊改成json格式
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
接着就是清空原有日志檔案 -> 修改收集日志的檔案
6.5、收集nginx和tomcat日志配置
[[email protected]_2 conf.d]# cat elk.conf
input {
file {
path => "/usr/local/tomcat/logs/*.txt"
type => "tomcat"
start_position => "beginning"
}
redis {
port => "6379"
password => "123456"
host => "192.168.204.92"
db => "1"
data_type => "list"
type => "redis"
key => "redis_nginx"
}
}
filter {
if [type] == "nginx" {
grok{
match => {"message" => "%{IPV4:my_ip}"}
}
}
}
filter {
if [type] == "tomcat" {
grok{
match => {"message" => "%{IPV4:my_ip}"}
}
}
}
output {
if [type] == "redis" {
elasticsearch {
hosts => ["192.168.204.91:9200"]
index => "redis_nginx%{+YYYY.MM.dd}"
}
}
if [type] == "tomcat" {
elasticsearch {
hosts => ["192.168.204.91:9200"]
index => "tomcat-%{+YYYY.MM.dd}"
}
}
}
七、使用 filebeat收集日志
7.1 安裝filebeat
下載下傳filebeat
rpm -ivh filebeat-7.7.1-x86_64.rpm
cd /etc/filebeat/
cp filebeat.yml filebeat.yml.bak6i
systemctl start filebeat.service
systemctl status filebeat.service
7.2 修改filebeat配置檔案
(1)/etc/filebeat/filebeat.yml
(2)/etc/logstash/conf.d/elk.conf
修改filebeat.yml
将采集的日志資訊輸出到redis
7.3收集日志需要修改日志為json格式
方法同上面6.3/6.4