四,Filebeat导入及建立多个索引
4.1 Filebeat安装
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.0-linux-x86_64.tar.gz
tar xzvf filebeat-7.10.0-linux-x86_64.tar.gz
解压后就可以使用了
启动命令
./filebeat -e
启动后关闭终端的话会终止进程,应该是需要做成nohup.out的形式,然后添加到开机启动里
nohup /usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml &
4.2 配置filebeat.yml
配置文件
filebeat.yml
分为三个主要部分
filebeat.inputs
日志输入
filebeat.inputs:
- type: log
# 修改成true才生效,默认是false
enabled: true
# 日志文件的存放路径
paths:
- /var/log/squid/access.log*
#可以自定义field
fields:
serverip: xxx.xxx.xxx.xxx
logtopic: test1
filebeat modules
模块,这个可以直接使用预先定义好的各种模板
我这里启用了但是没生效。。。等以后再研究研究
filebeat.config.modules:
# Glob pattern for configuration loading
# 各个模块的配置文件就放在下面的路径里面
path: ${path.config}/modules.d/*.yml
# Set to true to enable config reloading
reload.enabled: true
# Period on which files under path should be checked for changes
reload.period: 10s
filebeat outputs
输出,可以输出到很多服务器:
elasticsearch, logstash, kibana, kafka
这里因为之前构筑的logstash和elasticsearch都是用的回环地址,无法通过本机以外的电脑访问,对外只开放了kafka,所以这里只能设置输出到kafka
output.kafka:
# Boolean flag to enable or disable the output module.
enabled: true
# The list of Kafka broker addresses from which to fetch the cluster metadata.
# The cluster metadata contain the actual Kafka brokers events are published
# to.
hosts: ["kafka服务器的IP地址:9092"]
# The Kafka topic used for produced events. The setting can be a format string
# using any event field. To set the topic from document type use `%{[type]}`.
topic: 自己定义输出给kafka时的topic
# 由于无用的信息过多,所以通过codec.format指定,只输出message字段
codec.format:
string: '%{[message]}'
4.3 kafka和zookeeper
这两个软件不必修改,保持原来可以正常接收转发消息的状态即可
4.4 logstash
修改比较多
因为是不同的服务器发送来的access日志,所以不希望存放在同一个索引下
所以,必须对原配置文件进行三个主要的修改
一,input增加新的topic
二,日志的格式不同,所以filter要两个不同的日志分别进行过滤
三,output,不同的日志,需要设定成不同的topic发送给elasticsearch
4.4.1 Input
如果没有新增kafka的话,不用修改bootstrap,只增加新的topic就可以接收新的topic的日志了
topics => ["test_topic_1", "test_topic_NEW"]
4.4.2 Filter
过滤器这里有使用field过滤的,具体得看看传输过来的日志是否有可以用来区别的field
例如:
if [fields][userdefined_topic] == "NEW_TOPIC" {
grok{......}
mutate{......}
......
}
如果接收到的日志,无法使用field准确区分开,就可以使用正则表达式进行区分
# message段,以数字开头的日志
if [message] =~ "^[0-9]" {
grok{ match => ......}
......
mutate {
add_field => {"logtag" => "test_logtag1"}
}
}
else if [message] =~ "正则表达式" {
grok {}
...
mutate{add_field => {"logtag" => "test_logtag2"}}
}
else {
grok {}
...
}
这样就给两个不同的日志追加了不同的tag,可以在output的时候使用。
上面的结构,else if不是必须,
可以仅使用if 。。。 if 。。。
还可以if 。。。 else 。。。
4.4.3 Output
利用filter中添加的logtag进行区分
if [logtag] == "test_logtag1" {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "test-log-1-%{+YYY.MM.dd}"
codec => "json"
}
else if [logtag] == "test_logtag2" {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "test-log-2-%{+YYY.MM.dd}"
codec => "json"
}
# 支持else,不写入配置其他部分也可以正常执行
else {
}
4.5 跨索引查询聚合(未完成)