四,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 跨索引查询聚合(未完成)