日志数据采集器 Filebeat 安装及操作

1. Filebeat 安装及基本操作;

  • 下载
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.0-linux-x86_64.tar.gz
  • 解压到指定安装目录
tar zxvf filebeat-7.5.0-linux-x86.tar.gz -C /usr/local/filebeat
  • 修改配置文件
# FileBeat 的配置文件定义了在读取文件的位置,输出流的位置以及相应的性能参数
cd /usr/local/filebeat/
vim filebeat.yml

# 配置 1:定位 filebeat.inputs
# 可配置多个 type
- type: log
  enabled: true
  paths:
    - /var/log/*.log
    - /usr/local/nginx/logs/access.log
  tags: "test_filebeat"
  # 添加额外字段
  fields: 
  	server: localhost
  	type: nginx_access
  fields_under_root: true
  # 多行处理
  # 不以"yyyy-MM-dd"这种日期开始的行与前一行合并 
  multiline.pattern: ^\d{4}-\d{1,2}-\d{1,2}
  multiline.negate: true
  multiline.match: after
  # 5秒钟扫描一次以检查文件更新
  scan_frequency: 5s

# 配置 2(n 选一):配置 Filebeat 输出日志到哪里
# 2.1:配置 Filebeat 发送输出目录到 ElasticSearch(不用Logstash)
output.elasticsearch:
    hosts: ["localhost:9200"]
    username: "es_username"
    password: "{pwd}" 

# 2.2:配置 Filebeat 以使用 Logstash
# /usr/local/logstash/config/logstash-sample.conf 中配置 input beats port 为 5044
output.logstash:
      hosts: ["localhost:5044"]

# 2.3:配置 Filebeat 输出日志到 redis(不用Logstash)
output.redis:
  hosts: ["localhost:6379"]
  key: "redis"

# 配置 5:用 Kibana 仪表盘,这样配置 Kibana 端口:
setup.kibana:
      host: "http://192.168.60.221:5601"
      username: "kbn_username"
      password: "{pwd}" 
  • 设置 Kibana dashboards(可选)
# Filebeat 附带了 Kibana 仪表盘、可视化示例。
# 在用 dashboards 之前需要创建索引模式 filebeat-*,并且加载 dashboards 到 Kibana 中。
# 可以运行 setup 命令或者在 filebeat.yml 配置文件中配置 dashboard 加载
./filebeat/filebeat setup --dashboards
  • 启动
nohup ./filebeat -e -c filebeat.yml -d "publish" &

在这里插入图片描述

2. Filebeat 配合 Logstash 收集解析日志;

  • 实际场景中,Logstash 管道会复杂一些,通常有一个或多个 input、filter 和 output 插件
  • 场景:创建一个 Logstash 管道,并且使用 Filebeat 将 nginx 的 access.log 日志作为 input、解析这些日志,然后将解析的数据写入 ElasticSearch

2.1 配置 Filebeat 发送日志行到 Logstash;

# 1. Filebeat 目录下配置 filebeat.yml
vim /usr/local/filebeat/filebeat.yml
# 配置 1.1:filebeat 收集日志
filebeat.inputs
- type: log
  paths:
    - /usr/local/nginx/logs/access.log

# 配置 1.2:日志输出至 localhost
output.logstash:
  hosts: ["localhost:5044"]

# 2. Logstash 目录下新建 first-pipeline.conf
vim /usr/local/logstash/first-pipeline.conf
# 写入如下内容
# 注意:Logstash 管理有三部分(输入、过滤器、输出),这里input 下面 beats 的意思是用 beats 输入插件
input { beats { port => 5044 } }
output {
  stdout {}
}
# 保存退出

# 3. 启动 Logstash
# --config.test_and_exit 为启用自动配置加载,以至于每次修改完配置文件以后无需停止然后重启 Logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/first-pipeline.conf --config.reload.automatic

# 4. 启动 Filebeat
# 启动成功后,Logstash 控制台会有输出
/usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml -d "publish"

2.2 使用 Grok 过滤器插件解析日志;

  • 已经完成 Filebeat 读取日志行,但是日志消息的格式并不理想。想要解析日志消息,以便从日志中创建特定的、命名的字段,需要使用 grok filter 插件
  • grok 过滤器插件是 Logstash 中默认可用的几个插件之一,将非结构化日志数据解析为结构化和可查询的数据
# 编辑 Logstash 下的 first-pipeline.conf
vim /usr/local/logstash/first-pipeline.conf
# 修改为如下内容
input { beats { port => 5044 } }
filter {
	grok {
		match => { "message" => "%{COMBINEDAPACHELOG}"}
	}
	geoip { source => "clientip" }
}
output {
  stdout {}
}

# 退出保存完以后,因为已经启动了自动加载配置,所以不需要重启 Logstash
# 但是需要强制 Filebeat 从头读取日志文件
# 停止 Filebeat,然后删除 Filebeat 注册文件
rm -rf /usr/local/filebeat/data/registry/

# 重启 Filebeat
/usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml -d "publish"

2.3 索引数据至 Elasticsearch;

  • 之前的配置中,配置了 Logstash 输出到控制台,现在需要修改输出到 Elasticsearch
# 修改 Logstash 的 first-pipeline.conf
vim /usr/local/logstash/first-pipeline.conf
# 修改一下 output 内容
output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}
# 保存退出 
# 停止 Filebeat,然后删除 Filebeat 注册文件
rm -rf /usr/local/filebeat/data/registry/

# 重启 Filebeat
/usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml -d "publish"

# 查询索引
curl -X GET 'localhost:9200/[索引名]/_search?pretty&q=response=200'

2.4 项目实例;

  • filebeat 部分配置
filebeat.inputs:

 - type: log
  enabled: true
  paths:
         - /usr/local/nginx/logs/access.log
  fields: 
        source: xxx-pc
        type: nginx_access
  fields_under_root: true  

 - type: log
  enable: true
  # 抓取的日志文件路径
  paths:
         - /usr/local/nginx/logs/error.log
  # 添加额外的字段用于分辨日志来源和类型
  fields:
        source: xxx-pc
        type: nginx_error
  fields_under_root: true
  # 多行处理,不以“yyyy/MM/dd”这种日期的行,和前一行和并
  multiline.pattern: ^\d{4}/\d{1,2}/\d{1,2}
  multiline.negate: true
  multiline.match: after
  # 5 秒扫描一次文件更新
  #scan_frequency: 5s
  • logstash 配置
input { 
	beats { port => 5044 } 
}
filter {
	
	if [type] == "nginx_access" {	
		grok {
			match => {
				"message" =>[
					"%{IPORHOST:client_ip}\s{1,}\-\s\-\s\[%{HTTPDATE:time}\]\s{1,}\"(?:%{WORD:verb}\s{1,}%{NOTSPACE:request}(?:\s{1,}HTTP/%{NUMBER:http_version})?|-)\" %{NUMBER:response}\s{1,}(?:%{NUMBER:bytes}|-)\s{1,}%{QS:referrer}\s{1,}%{QS:agent}"				
				]
			}
		}
		date {
			match => ["time","dd/MMM/yyyy:HH:mm:ss Z"]
            target => "logdate"
		}
		ruby{
            code => "event.set('logdateunix',event.get('logdate').to_i)"
        }	
		geoip {
			source => "client_ip"
		}
	} else if [type] == "nginx_error" { 
        	grok {
        		match => [
            			"message", "(?<time>\d{4}/\d{2}/\d{2}\s{1,}\d{2}:\d{2}:\d{2})\s{1,}\[%{DATA:err_severity}\]\s{1,}(%{NUMBER:pid:int}#%{NUMBER}:\s{1,}\*%{NUMBER}|\*%{NUMBER}) %{DATA:err_message}(?:,\s{1,}client:\s{1,}(?<client_ip>%{IP}|%{HOSTNAME}))(?:,\s{1,}server:\s{1,}%{IPORHOST:server})(?:, request: %{QS:request})?(?:, host: %{QS:client_ip})?(?:, referrer: \"%{URI:referrer})?",
            			"message", "(?<time>\d{4}/\d{2}/\d{2}\s{1,}\d{2}:\d{2}:\d{2})\s{1,}\[%{DATA:err_severity}\]\s{1,}%{GREEDYDATA:err_message}"
            	]
        	}
        	date{
            	match => ["time","yyyy/MM/dd HH:mm:ss"]
            	target => "logdate"
        	}
        	ruby{
            	code => "event.set('logdateunix',event.get('logdate').to_i)"
        	}
    }
}

output {
	elasticsearch {
		hosts => ["localhost:9200"]
		user => "elastic"
		password => "xxxxxxxx"
		index => "%{[source]}_%{[type]}_%{+YYYY.MM}"
	}
}
发布了119 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/hualaoshuan/article/details/103702998