一、logstash的簡介
一般我們看日志來解決問題的時候要么 tail+grep 要么 把日志下載下來再搜索,可以應付不多
的主機和應用不多的部署場景。但對於多機多應用部署就不合適了。這里的多機多應用指的是
同一種應用程序被部署到幾台服務器上,每台服務器上又部署着不同的多個應用程序。可以想
象,在這種場景下,為了監控或者搜索某段日志,需要登陸多台服務器,執行多個tail -F和grep
命令來分析日志。一方面這很被動。另一方面,效率非常低,數次操作下來,程序員的心情也
會變糟,所以就有了logstash的出現。
logstash 是解決分布式系統的日志問題管理的一種工具。其基本原理是后台跑着一個logstash的
程序,這個程序負責匯總所有日志到一個本地文件中。只要執行tail -f這個文件就可以做到監控
多台應用服務的日志了。因為所有日志都匯總在一個目標文件里了,所以做日志搜索的時候只要針
對這一個文件搜索就可以了
下面我們來講一下logstash+redis是如何實現多服務器且每台服務器多應用日志收集到日志服務器的
logstash+redis的這種方式其實和els+kabina+logstash的作用差不多,只不過第二種方式多了個可視
化日志的界面,但是第一種方式比較簡單,第二種方式比較有逼格一點
二、logstash部署架構
解釋術語:
Shipper:日志收集者。負責監控本地日志文件的變化,及時把日志文件的最新內容收集起來,輸出到Redis暫存。
Indexer:日志存儲者。負責從Redis接收日志,寫入到本地文件。
Broker :日志管理者。redis用來連接多個Shipper和多個Indexer。
三、開始搭建logstash+redis
服務器環境:
web1服務器 192.168.11.3
web2服務器 192.168.11.4
日志服務器 192.168.11.5
logstash 在web1服務器 、 web2服務器 、日志服務器都要安裝
redis 為了取消你的多疑心里,redis咱就安裝在日志服務器好了(其實redis安裝在哪一台都可以)
角色划分:
web1服務器 logstash
web2服務器 logstash
日志服務器 logstash 、redis(redis之前就已經在日志服務器安裝好了,我這里就不介紹redis的安裝了)redis的安裝請跳轉至https://www.cnblogs.com/ouyangfei/p/12091102.html
說明:三台服務器的logstash指的是logstash-7.4.2.tar.gz這個安裝包,這個包在三台服務器都要安裝
------------------------------------------------------------------------------------------------------------------------
web1服務器安裝:192.168.11.3
安裝Java :
下載JDK壓縮包。
tar -zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8 /usr/local/
配置JAVA_HOME環境變量
vim /etc/profile 下面的內容添加到文件的最后一行
export JAVA_HOME=/usr/local/jdk1.8
export PATH=${JAVA_HOME}/bin:$PATH
:wq 保存退出
java -version 查看java的版本信息並確認是否安裝成功
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
安裝Logstash :
去官網下載Logstash的壓縮包。https://www.elastic.co/cn/downloads/past-releases#logstash
tar -zxvf logstash-7.4.2.tar.gz
mv logstash-7.4.2 /usr/local/
ln -s logstash-7.4.2 logstash 創建軟連接
完了之后咱先不着急啟動logstash,請接着往下看
現在我們收集web1服務器下某個應用服務的日志如 website.log website-error.log,咋們web應用服務主要就是收集這兩個日志
mkdir -p /etc/logstash/conf
cd /etc/logstash/conf
vim web-log.conf 創建website.log的logstash啟動配置文件,添加如下內容
input {
file {
path => [
"/wefintek/education/website/logs/website.log" (這里填寫你需要收集的本服務器路徑下的web日志文件)
]
type => "website-log" (名字隨意取,但必須下面的保持一致)
}
}
output {
if [type] == "website-log" {
redis {
host => "192.168.11.5" redis主機IP地址
port => 7890 redis端口號
db => 12 redis的12號庫(如果你的redis是專門給logstash用的話,這里1-15號庫隨便填,但要和日志服務器的保持一致)
password => "Yang_20191118" redis的密碼
data_type => "channel" 會話模式,channel模式
key => "/wefintek/education/website/logs/website-log" (key的名字隨便取但是要和日志服務器的input保持一致)
}
}
}
filter {
mutate {
replace => ["host", "192.168.11.3"] 按自定義的這種格式輸出到日志
}
}
:wq 保存退出
data_type的可選值有channel和list兩種。用過Redis的人知道,channel是Redis的發布/訂閱通信模式,而list是Redis的隊列數據結構。兩者都可以用來實現系統間有序的消息異步通信。channel相比list的好處是,解除了發布者和訂閱者之間的耦合。舉個例子,一個Indexer在持續讀取Redis中的記錄,現在想加入第二個Indexer,如果使用list,就會出現上一條記錄被第一個Indexer取走,而下一條記錄被第二個Indexer取走的情況,兩個Indexer之間產生了競爭,導致任何一方都沒有讀到完整的日志。channel就可以避免這種情況。這里Shipper角色的配置文件和下面將要提到的Indexer角色的配置文件中都使用了channel。
vim web-error.conf 創建website-error.log的logstash啟動配置文件,添加如下內容
input {
file {
path => [
"/wefintek/education/website/logs/website-error.log" 這里填寫你需要收集的本服務器路徑下的文件。
]
type => "website-error-log"
}
}
output {
if [type] == "website-error-log" {
redis {
host => "192.168.11.5"
port => 7890
db => 12
password => "Yang_20191118"
data_type => "channel"
key => "/wefintek/education/website/logs/website-error-log" (key的名字隨便取但是要和日志服務器的input保持一致)
}
}
}
filter {
mutate {
replace => ["host", "192.168.11.3"] 按自定義的這種格式輸出到日志
}
}
:wq 保存退出
現在啟動配置文件website-log.conf和website-error.conf都准備好了,但是咱還是不要着急啟動
說明:啟動logstash之前需要更改下配置文件logstash.yml
vim /usr/local/logstash/config/logstash.yml
http.host: "127.0.0.1" 改為 http.host: "0.0.0.0" (127.0.0.1只能本地連接,0.0.0.0表示所有服務器都可以連接)
為了安全着想,可以在雲控制台的安全規則里面添加端口的授權IP(logstash的端口9600)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
web2服務器:192.168.11.4
安裝Java :
下載JDK壓縮包。
tar -zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8 /usr/local/
配置JAVA_HOME環境變量
vim /etc/profile 下面的內容添加到文件的最后一行
export JAVA_HOME=/usr/local/jdk1.8
export PATH=${JAVA_HOME}/bin:$PATH
:wq 保存退出
java -version 查看java的版本信息並確認是否安裝成功
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
安裝Logstash :
去官網下載Logstash的壓縮包。https://www.elastic.co/cn/downloads/past-releases#logstash
tar -zxvf logstash-7.4.2.tar.gz
mv logstash-7.4.2 /usr/local/
ln -s logstash-7.4.2 logstash 創建軟連接
完了之后咱先不着急啟動logstash,請接着往下看
現在我們收集web2服務器下的應用服務的日志 website.log website-error.log (web1和web2部署的服務都是一模一樣的,用nginx做的負載均衡)
mkdir -p /etc/logstash/conf
cd /etc/logstash/conf
vim web-log.conf 創建website.log的logstash啟動配置文件,添加如下內容
input {
file {
path => [
"/wefintek/education/website/logs/website.log" (這里填寫你需要收集的本服務器路徑下的web日志文件)
]
type => "website-log" (名字隨意取,但必須下面的保持一致)
}
}
output {
if [type] == "website-log" {
redis {
host => "192.168.11.5" redis主機IP地址
port => 7890 redis端口號
db => 12 redis的12號庫(如果你的redis是專門給logstash用的話,這里1-15號庫隨便填,但要和日志服務器的保持一致)
password => "Yang_20191118" redis的密碼
data_type => "channel" 會話模式,channel模式
key => "/wefintek/education/website/logs/website-log" (key的名字隨便取但是要和日志服務器的input保持一致)
}
}
}
filter {
mutate {
replace => ["host", "192.168.11.4"] 按自定義的這種格式輸出到日志
}
}
:wq 保存退出
vim web-error.conf 創建website-error.log的logstash啟動配置文件,添加如下內容
input {
file {
path => [
"/wefintek/education/website/logs/website-error.log" 這里填寫你需要收集的本服務器路徑下的文件。
]
type => "website-error-log"
}
}
output {
if [type] == "website-error-log" {
redis {
host => "192.168.11.5"
port => 7890
db => 12
password => "Yang_20191118"
data_type => "channel"
key => "/wefintek/education/website/logs/website-error-log" (key的名字隨便取但是要和日志服務器的input保持一致)
}
}
}
filter {
mutate {
replace => ["host", "192.168.11.4"] 按自定義的這種格式輸出到日志
}
}
:wq 保存退出
現在啟動配置文件website-log.conf和website-error.conf都准備好了,但是咱也不要着急啟動
說明:啟動logstash之前需要更改下配置文件logstash.yml
vim /usr/local/logstash/config/logstash.yml
http.host: "127.0.0.1" 改為 http.host: "0.0.0.0" (127.0.0.1只能本地連接,0.0.0.0表示所有服務器都可以連接)
為了安全着想,可以在雲控制台的安全規則里面添加端口的授權IP(logstash的端口9600)
--------------------------------------------------------------------------------------------------------------------------
日志服務器:192.168.11.5
安裝Java :
下載JDK壓縮包。
tar -zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8 /usr/local/
配置JAVA_HOME環境變量
vim /etc/profile 下面的內容添加到文件的最后一行
export JAVA_HOME=/usr/local/jdk1.8
export PATH=${JAVA_HOME}/bin:$PATH
:wq 保存退出
java -version 查看java的版本信息並確認是否安裝成功
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
安裝Logstash :
去官網下載Logstash的壓縮包。https://www.elastic.co/cn/downloads/past-releases#logstash
tar -zxvf logstash-7.4.2.tar.gz
mv logstash-7.4.2 /usr/local/
ln -s logstash-7.4.2 logstash 創建軟連接
完了之后咱先不着急啟動logstash,請接着往下看
mkdir -p /etc/logstash/conf
cd /etc/logstash/conf
vim web-log.conf
input {
redis {
type => "website-log"
host => "192.168.11.5"
port => 7890
password => "Yang_20191118"
db => 12
data_type => "channel"
key => "/wefintek/education/website/logs/websitelog" 和web服務器配置的key保持一致
}
}
output {
if [type] == "website-log" {
file {
path => "/root/logs/website-log/website-%{+YYYY.MM.dd}.log" 將日志輸出到本服務器的規定目錄下並自帶日期
flush_interval => 0
}
}
}
:wq
vim web-error.conf
input {
redis {
type => "website-error-log"
host => "192.168.11.5"
port => 7890
password => "Yang_20191118"
db => 12
data_type => "channel"
key => "/wefintek/education/website/logs/website-error-log" 和web服務器配置的key保持一致
}
}
output {
if [type] == "website-error-log" {
file {
path => "/root/logs/website-log/website-error-%{+YYYY.MM.dd}.log"
flush_interval => 0
}
}
}
:wq
現在啟動配置文件website-log.conf和website-error.conf都准備好了,但是咱也還是不要着急啟動
說明:啟動logstash之前需要更改下配置文件logstash.yml
vim /usr/local/logstash/config/logstash.yml
http.host: "127.0.0.1" 改為 http.host: "0.0.0.0" (127.0.0.1只能本地連接,0.0.0.0表示所有服務器都可以連接)
為了安全着想,可以在雲控制台的安全規則里面添加端口的授權IP(logstash的端口9600)
--------------------------------------------------------------------------------------------------------------------------------------------------------------
是時候該着急了,咋們總算能啟動logstash了
先在Web1服務器上啟動:
cd /root
mkdir logs
touch logs/logstash.log (logstash的啟動是在當前終端上的,ctrl + C就停止logstash的進程了,所以創建日志文件以后台的方式啟動)
vim logstart.sh 啟動腳本(logstash本身是沒有腳本的,一般都是手敲命令啟動,所以要創建腳本)
#!/bin/bash
a=`ps -elf | grep logstash | grep /usr/java/jdk1.8.0_121/bin/java | awk '{print $4}'`
if [ "$a" > "0" ]
then
echo "logstash is really running"
else
cd /usr/local/logstash
nohup /usr/local/logstash/bin/logstash -f /etc/logstash/conf &>/root/logs/logstash.log &
fi
:wq
chmod 755 logstart.sh
vim logstop.sh 停止腳本
#!/bin/bash
a=`ps -elf | grep logstash | grep /usr/java/jdk1.8.0_121/bin/java | awk '{print $4}'`
if [ $a > 0 ]
then kill -9 $a
else
echo "logstash is really stop"
fi
:wq
chmod 755 logstop.sh
sh logstart.sh
tail -f logs/logstash.log 查看是否報錯
---------------------------------------------------
將啟動和停止腳本復制到web2服務器的/root/下面,然后再啟動
cd /root
mkdir logs
touch logs/logstash.log
vim logstart.sh
復制粘貼過來
:wq 保存退出
vim logstop.sh
復制粘貼過來
:wq 保存退出
chmod 755 logstart.sh logstop.sh
sh logstart.sh
tail -f logs/logstash.log 查看是否報錯
--------------------------------------------
將腳本復制到日志服務器的/root/下面,然后再啟動
cd /root
mkdir logs
touch logs/logstash.log
mkdir logs/website-log
vim logstart.sh
復制粘貼過來
:wq 保存退出
vim logstop.sh
復制粘貼過來
:wq 保存退出
chmod 755 logstart.sh logstop.sh
sh logstart.sh
tail -f logs/logstash.log 查看是否報錯
--------------------------------------------------
最后在r日志服務器觀察相應web的集合日志
cd /root
tail -f logs/web-log/website.log
--------------------------------------------------
我們也可以手動測試一下,模擬日志產生
在web1服務器
echo "Hello World" >> /wefintek/education/website/logs/website.log
如果日志服務器tail -f /root/logs/web-log/website.log 出現: 192.168.11.3 B[1] Hello World,說明web1服務器的website.log收集成功。
--------------------------------------------------
為了保險起見,web2服務器我們也可以手動測試
echo "I want to your home" >> /wefintek/education/website/logs/website.log
如果日志服務器tail -f /root/logs/web-log/website.log 出現: 192.168.11.4 B[1] I want to your home,說明web2服務器的website.log收集成功。
如果你願意你也可以把web1服務器、web2服務器的website-error.log 也測試一下
到此logstash+redis安裝完成了
說明:生產中可能會看到重復的日志,你可以到源服務器去看下源日志是否有重復,一般都是原日志有重復,所以我們
收集的日志里面才會有重復,網上很多人說數據有重復,其實是你沒有安裝好,網上的搭建寫的都不全,只要按照我這
種安裝的方式是不會有重復日志數據的問題的。