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中,所以在配置中添加如上配置进行区分。
有问题欢迎留言,对相关课程感兴趣的可以留言