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中,所以在配置中添加如上配置進行區分。
有問題歡迎留言,對相關課程感興趣的可以留言