附加技巧
步驟流程:
使用filebeat收集一台主機上兩個不同應用的日志,傳遞給redis,然后logstash從redis中拉去數據傳遞給elasticsearch
1.filebeat.yml文件配置
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/openresty/nginx/logs/host.access.log # 假設應用1的日志路徑
fields:
log_source: messages # logstash判斷日志來源
- type: log
enabled: true
paths:
- /usr/local/openresty/nginx/logs/error.log # 假設應用2的日志路徑
fields:
log_source: secure
# 輸出到redis的第一個數據庫
# 默認是list形式
output.redis:
hosts: ["192.168.80.107:6379"]
key: messages_secure # redis中的鍵,值是一個列表,倆表中存儲的一行一行的上面兩個應用的日志,logstash中會用到這個參數
password: foobar2000 # redis訪問密碼
db: 0
2.logstash目錄下conf.d/*.conf文件配置
input {
redis {
host => "192.168.80.107"
port => 6379
password => foobar2000 # redis訪問密碼
data_type => "list" # redis存儲的值類型
key => "messages_secure" # redis中的鍵,跟filebeat.yml配置文件中輸出到redis.output一樣
db => 0 # 指定的redis數據庫
}
}
output {
# 根據redis鍵 messages_secure 對應的列表值中,每一行數據的其中一個參數來判斷日志來源
if [fields][log_source] == 'messages' {
elasticsearch {
hosts => ["http://192.168.80.104:9200", "http://192.168.80.105:9200","http://192.168.80.106:9200"]
index => "filebeat-message-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "elastic123"
}
}
if [fields][log_source] == 'secure' {
elasticsearch {
hosts => ["http://192.168.80.104:9200", "http://192.168.80.105:9200","http://192.168.80.106:9200"]
index => "filebeat-secure-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "elastic123"
}
}
}
如下是redis列表值中的兩條不同的數據,刪除元數據后的數據
fields字段值是在filebeat.yml中設置的,根據這個值得不同,進而在elasticsearch中創建不同的索引
{
"fields": {
"log_source": "secure"
},
"log": {
"offset": 12944,
"file": {
"path": "/usr/local/openresty/nginx/logs/error.log"
}
},
"message": "2019/08/28 00:01:47 [error] 6764#6764: *4 open() \"/usr/local/openresty/nginx/html/lua\" failed (2: No such file or directory), client: 192.168.80.1, server: localhost, request: \"GET /lua HTTP/1.1\", host: \"192.168.80.108\"",
}
{
"log": {
"offset": 723861,
"file": {
"path": "/usr/local/openresty/nginx/logs/host.access.log"
}
},
"message": "192.168.80.1 - - [28/Aug/2019:00:01:47 +0800] \"GET /lua HTTP/1.1\" 404 131 \"-\" \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0\" \"-\"",
"fields": {
"log_source": "messages"
},
}
研究:若是倆應用的日志想分別輸出到redis不同的庫,設置不同的redis鍵,要如何操作?
- filebeat.inputs寫倆的話,默認最后一個secure的生效才會收集日志,messages的不會生效收集日志,比如下面的寫法:
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/openresty/nginx/logs/host.access.log # 假設應用1的日志路徑
fields:
log_source: messages # logstash判斷日志來源
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/openresty/nginx/logs/error.log # 假設應用2的日志路徑
fields:
log_source: secure
2.output.redis寫倆的話默認最后一個的bbb生效,比如下面的這種寫法:
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/openresty/nginx/logs/host.access.log # 假設應用1的日志路徑
fields:
log_source: messages # logstash判斷日志來源
- type: log
enabled: true
paths:
- /usr/local/openresty/nginx/logs/error.log # 假設應用2的日志路徑
fields:
log_source: secure
# 輸出到redis的第一個數據庫
# 默認是list形式
output.redis:
hosts: ["192.168.80.107:6379"]
key: messages_secure # redis中的鍵,值是一個列表,倆表中存儲的一行一行的上面兩個應用的日志,logstash中會用到這個參數
password: foobar2000 # redis訪問密碼
db: 0
output.redis:
hosts: ["192.168.80.107:6379"]
key: bbb # redis中的鍵,值是一個列表,倆表中存儲的一行一行的上面兩個應用的日志,logstash中會用到這個參數
password: foobar2000 # redis訪問密碼
db: 1
- 若是如下這種寫法,均只有最后一個生效,也就是只會收集secure的日志,並傳輸到redis的bbb這個里
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/openresty/nginx/logs/host.access.log
fields:
log_source: messages
output.redis:
hosts: ["192.168.80.107:6379"]
key: aaa
password: foobar2000
db: 0
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/openresty/nginx/logs/error.log
fields:
log_source: secure
output.redis:
hosts: ["192.168.80.107:6379"]
key: bbb
password: foobar2000
db: 0
所以這個問題還有待研究,或者使用不同的inputs來源,或者使用不同的output輸出
查看集群主從分配
http://192.168.80.104:9200/_cat/nodes?v
查看集群狀態
http://192.168.80.104:9200/_cluster/health?pretty
小技巧,查看filebeat獲取的日志結果
可以把filebeat收集的日志傳輸到redis中,在redis中查看,若日志正確無誤,然后再開啟logstash從redis中拉取數據