0 環境
Linux主機,cengtos7系統
安裝有openresty軟件,用來訪問生成日志信息 1.15.8版本
安裝有filebeat軟件,用來收集openresty的日志 7.3版本
安裝有redis軟件,用來接收filebeat發送過來的日志,5.0.5版本
fields_under_root的值默認是false
1. filebeat.yml配置
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/openresty/nginx/logs/host.access.log
fields:
log_source: messages
fields_under_root: true
output.redis:
hosts: ["192.168.0.142:6379"]
key: nginx_log
password: foobar2000
db: 0
如下參數的效果
fields:
log_source: messages
fields_under_root: true
使用fields表示在filebeat收集的日志中多增加一個字段log_source,其值是messages,用來在logstash的output輸出到elasticsearch中判斷日志的來源,從而建立相應的索引
若fields_under_root設置為true,表示上面新增的字段是頂級參數,在redis中查看的話效果如下:
頂級字段在output輸出到elasticsearch中的使用如下:
output {
# 根據redis鍵 messages_secure 對應的列表值中,每一行數據的其中一個參數來判斷日志來源
if [log_source] == 'messages' { # 注意判斷條件的寫法
elasticsearch {
hosts => ["http://192.168.80.104:9200"]
index => "filebeat-message-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "elastic123"
}
}
}
若fields_under_root設置為false,表示上面新增的字段是則是fields的二級字段,在redis中查看的話效果如下:
fields二級字段在output輸出到elasticsearch中的使用如下:
output {
# 根據redis鍵 messages_secure 對應的列表值中,每一行數據的其中一個參數來判斷日志來源
if [fields][log_source] == 'messages' { # 注意判斷條件的寫法
elasticsearch {
hosts => ["http://192.168.80.104:9200"]
index => "filebeat-message-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "elastic123"
}
}
}
2. 若是多個應用的日志都輸出到redis中,只需要在filebeat.inputs:下面再新增- type: log
段就行,如下所示:
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
### 新增的###
output.redis:
hosts: ["192.168.80.107:6379"]
key: messages_secure
password: foobar2000
db: 0
在redis中顯示的效果是都會輸出到key值對應的列表中,根據key值是沒法進行區分的,只能根據key值列表中每一行數據中的log_source來判斷該行是哪一個應用的日志
3. 不同的應用日志使用不同的rediskey值
使用output.redis中的keys值,官方例子
output.redis:
hosts: ["localhost"]
key: "default_list"
keys:
- key: "error_list" # send to info_list if `message` field contains INFO
when.contains:
message: "error"
- key: "debug_list" # send to debug_list if `message` field contains DEBUG
when.contains:
message: "DEBUG"
- key: "%{[fields.list]}"
mappings:
http: "frontend_list"
nginx: "frontend_list"
mysql: "backend_list"
大致意思是說,默認的key值是default_list,keys的值是動態分配創建的,當redis接收到的日志中message字段的值包含有INFO字段,則創建key為info_list,當包含有DEBUG字段,則創建key為debug_list。
問題的解決方法是在每個應用的輸出日志中新增一個能夠區分這個日志的值,然后再在keys中設置,這樣一來就能夠把不同應用的日志輸出到不同的redis的key中
mappings這個還沒看懂啥意思,刪除mappings這幾行也可以
redis中的效果顯示:根據官方例子實際修改了一下參數
順帶拓展一下這個內容,logstash7.3從redis中拉取日志時也需要設置這個key值
filebeat這邊是動態生成的key值,那logstash中要如何設置這個?
解決辦法:
logstash設置的話時需要在目錄/etc/logstash/conf.d
下面創建以.conf
結尾的文件
可以創建多個這樣的conf文件,每個文件中從redis取值的設置key值都不同,具體來說就是根據filebeat動態生成的key值設置,然后再輸出到相應的elasticsearch中創建不同的索引
拓展一下:假設使用的是nginx,部署多個項目,監控每個項目的access訪問文件
ngixn中access日志格式log_format只能配置在http段,若是修改這個的話那所有的項目訪問日志還是在同一個redis的key中,
那要如何才能在監控nginx下多個項目的access訪問日志下使用redis的不同key值?
暫時還沒想好咋解決這個問題