ELK Stack在多項目情況下filebeat與logstash的多文件配置

ELK Stack環境的相關搭建可以參考我的上一篇文章

這裏配置中涉及到的域名在對應機器上要配置host,kafka的host
假設這裏有兩個項目:insurance項目,app項目

insurance項目生產環境filebeat配置filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/ad/logs/*.log
  # 向輸出的每一條日誌添加額外的信息,比如“level:debug”,方便後續對日誌進行分組統計。
  # 默認情況下,會在輸出信息的fields子目錄下以指定的新增fields建立子目錄,例如fields.level
  # 這個得意思就是會在es中多添加一個字段,格式爲 "filelds":{"level":"debug"}
  fields:
    host: 192.168.0.94
    # 每個filebeat對應的機器的ip,區分日誌機器來源
  multiline.pattern: ^\[
  multiline.negate: true
  multiline.match: after
  # 上面配置的意思是:不以[開頭的行都合併到上一行的末尾
  #pattern:正則表達式
  #negate:true 或 false;默認是false,匹配pattern的行合併到上一行;true,不匹配pattern的行合併到上一行
  #match:after 或 before,合併到上一行的末尾或開頭
#-------------------------- Kafka output ------------------------------
output.kafka:
  hosts: ["kafka1:9092","kafka2:9092","kafka3:9092"]
  topic: filebeat
  required_acks: 1
# 其他output都註釋掉

app生產環境filebeat配置filebeat-app.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/ad/logs/logs-*.log
  # 向輸出的每一條日誌添加額外的信息,比如“level:debug”,方便後續對日誌進行分組統計。
  # 默認情況下,會在輸出信息的fields子目錄下以指定的新增fields建立子目錄,例如fields.level
  # 這個得意思就是會在es中多添加一個字段,格式爲 "filelds":{"level":"debug"}
  fields:
    host: 10.10.99.108
    # 對應一個服務來命名
    app: app
    # 每個filebeat對應的機器的ip,區分日誌機器來源
  multiline.pattern: ^20
  multiline.negate: true
  multiline.match: after
  # 上面配置的意思是:不以[開頭的行都合併到上一行的末尾
  #pattern:正則表達式
  #negate:true 或 false;默認是false,匹配pattern的行合併到上一行;true,不匹配pattern的行合併到上一行
  #match:after 或 before,合併到上一行的末尾或開頭
#-------------------------- Kafka output ------------------------------
output.kafka:
  hosts: ["kafka1:9092","kafka2:9092","kafka3:9092"]
  topic: filebeat-app
  required_acks: 1
# 其他output都註釋掉

logstash配置

兩個項目分別寫到自己kafka topic,logstash啓用兩個配置文件分別讀取數據分別寫es,logstash的啓動命令把配置文件路徑改爲一個文件夾路徑即可,這個文件夾放着這兩個配置文件。

first-pipeline.conf

input {
  kafka {
    bootstrap_servers => ["kafka1:9092,kafka2:9092,kafka3:9092"]
    topics => "filebeat"
    group_id => "es"
    codec => json
    client_id => "app001"
    type => "app"
  }
}

filter {
  if [type] == "app"{
    grok {
      match => { "message" => "\[%{DATA:app}\] \[%{DATA:timestamp}\] \[%{DATA:thread}\] \[%{LOGLEVEL:level}\] \[%{DATA:class}\] (?<msg>(.|\r|\n)*)" }
    }
    
    date {
      match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
      target => "@timestamp"
    }

    mutate {
      remove_field => ["beat.name"]
    }
  }
}

output {
  if [type] == "app"{
    elasticsearch {
      hosts => ["http://localhost:9200"]
      document_type => "APP-LOG"
      #host => "%{[@host][beat]}"
      #index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
      #user => "elastic"
      #password => "changeme"
    }
  }
}

second-pipeline.conf

input {
  kafka {
    bootstrap_servers => ["kafka1:9092,kafka2:9092,kafka3:9092"]
    topics => "filebeat-second"
    group_id => "es"
    codec => json
    client_id => "second001"
    type => "second"
  }
}

filter {
  if [type] == "second"{
    grok {
      match => { "message" => "%{DATA:timestamp} \[%{DATA:thread}\] %{LOGLEVEL:level} %{DATA:class} - (?<msg>(.|\r|\n)*)" }
    }
    
    date {
      match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]
      target => "@timestamp"
    }

    mutate {
      remove_field => ["beat.name"]
    }
  }
}

output {
  if [type] == "second"{
    elasticsearch {
      hosts => ["http://localhost:9200"]
      document_type => "IDAI-LOG"
      index => "app-%{+YYYY.MM.dd}"
      #host => "%{[@host][beat]}"
      #index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
      #user => "elastic"
      #password => "changeme"
    }
  }
  
}

如果單純的把多個配置文件讀取的話,兩個topic的數據會同時寫到es中,所以在配置中添加如上配置進行區分。

有問題歡迎留言,對相關課程感興趣的可以留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章