使用filebeat收集日志傳輸到redis的各種效果展示


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值?

暫時還沒想好咋解決這個問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM