一、Filebeat简介
filebeat 是基于原先 logstash-forwarder 的源码改造出来的。换句话说:filebeat 就是新版的 logstash-forwarder,也会是 Elastic Stack 在 shipper 端的第一选择。Filebeat是本地文件的日志数据采集器。 作为服务器上的代理安装,Filebeat监视日志目录或特定日志文件,tail file,并将它们转发给Elasticsearch或Logstash进行索引、kafka 等。
Filebeat
官网:https://www.elastic.co/cn/products/beats/filebeat
文档:https://elkguide.elasticsearch.cn/beats/file.html
Filebeat由两个主要组件组成:
prospectors 和 harvesters。 这些组件一起工作来尾随文件并将事件数据发送到您指定的输出。
- harvesters
harvesters负责读取单个文件的内容。 harvesters逐行读取每个文件,并将内容发送到输出。 每个文件启动一台harvesters。 harvesters负责打开和关闭文件,这意味着在harvesters运行时文件描述符保持打开状态。 如果在收获文件时删除或重命名文件,Filebeat将继续读取文件。 这有副作用,在harvesters关闭之前,磁盘上的空间被保留。 默认情况下,Filebeat保持文件打开,直到达到close_inactive的设置(close_inactive默认为5分钟,即5分钟之内,没有最新的日志信息产生则关闭文件句柄)。
关闭harvester有以下情况:
1.如果在harvester还在读取文件时文件被删除,那么文件处理程序关闭,释放基础资源。
2.只有在scan_frequency过后,文件的采集才会重新开始。(scan_frequency参数默认为10秒,每隔10秒prospector检查目录中日志文件的变化情况)
3.如果在harvester关闭的情况下移动或移除文件,则不会继续收集文件。
- prospector
prospector负责管理harvesters并找到所有的读取源。如果输入类型是日志,则prospector会查找驱动器上与所定义的全局路径匹配的所有文件,并为每个文件启动一个harvesters。 每个prospector都在自己的实例中运行。
以下示例将Filebeat配置为从与指定的glob模式匹配的所有日志文件中获取行:
filebeat.prospectors:
- type: log
paths:
- /var/log/*.log
- /var/path2/*.log
Filebeat目前支持两种prospector类型:log和stdin。 每个prospector类型可以定义多次。
Filebeat的prospectors只能读取本地文件。 没有功能连接到远程主机读取存储的文件或日志。
Filebeat如何保持文件的状态?
Filebeat保持每个文件的状态,并经常刷新注册表文件中的磁盘状态。状态用于记住收割机正在读取的最后偏移量,并确保发送所有日志行。
# 状态信息记录在/usr/local/filebeat-6.1.1/data目录中的registry文件
[root@vl010001134060 data]# pwd
/usr/local/filebeat-6.1.1/data
[root@vl010001134060 data]# ls
meta.json registry
如果输出(如Elasticsearch或Logstash)无法访问,Filebeat将跟踪发送的最后一行,并在输出再次可用时继续读取文件。当Filebeat正在运行时,每个prospectors的状态信息也被保存在内存中。当Filebeat重新启动时,来自注册表文件的数据被用来重建状态,并且Filebeat继续在最后一个已知位置的每个harvester。
每个prospectors为每个找到的文件保留一个状态。由于文件可以被重命名或移动,文件名和路径不足以识别文件。对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。
如果您的使用案例涉及每天创建大量新文件,您可能会发现注册表文件会变得太大。(使用clean_inactive、clean_removed参数来调整)
Filebeat如何确保至少一次交付?
Filebeat保证事件至少被传递到配置的输出一次,没有数据丢失。 Filebeat能够实现此行为,因为它将每个事件的传递状态存储在注册表文件中。
在定义的输出被阻止并且没有确认所有事件的情况下,Filebeat会一直尝试发送事件,直到输出确认已经收到事件。
如果Filebeat在发送事件的过程中关闭,则不会等待输出在关闭之前确认所有事件。 任何发送到输出的事件,在Filebeat关闭之前没有被确认,在重新启动Filebeat时会再次发送。 这可确保每个事件至少发送一次,但最终可能会将重复事件发送到输出。 您可以通过设置shutdown_timeout选项来配置Filebeat以在关闭之前等待特定时间。(shutdown_timeout选项默认是关闭状态,可以设置时间,关闭时等待多长时间后再关闭)。
但是如果日志写入磁盘的速度超过了Filebeat读取日志的速度,当日志删除或者日志被覆盖时,则可能会丢失数据。
例如:
在Linux文件系统上,Filebeat使用inode和设备来识别文件。从磁盘中删除文件时,可将inode分配给新文件。在涉及文件旋转的使用情况下,如果旧文件被删除并且之后立即创建新文件,则新文件可能与删除的文件具有完全相同的inode。在这种情况下,Filebeat假定新文件与旧文件相同,并尝试在旧位置继续读取,这是不正确的。
默认状态不会从注册表文件中删除。要解决inode重用问题,我们建议您使用clean_ *选项(特别是clean_inactive)来删除非活动文件的状态。例如,如果您的文件每24小时轮换一次,并且轮换的文件不再更新,则可以将ignore_older设置为48小时,将clean_inactive设置为72小时。
您可以使用clean_removed从磁盘中删除的文件。请注意,clean_removed会在扫描期间无法找到文件时清除注册表中的文件状态。如果该文件稍后再次显示,则将从头开始重新发送。
二、下载安装(手动安装)
下载地址:https://www.elastic.co/guide/en/beats/filebeat/6.4/setup-repositories.html
- 下载
# 6.4.3版本下载
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.3-linux-x86_64.tar.gz
# 解压
[root@localhost ~]# tar -zxvf filebeat-6.4.3-linux-x86_64.tar.gz -C /usr/local
- 配置
同yum。 - 启动测试
nohup ./bin/filebeat & --在后台运行
三、(YUM)安装(参照官网)
- 导入key
[root@localhost ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
- 创建repo 文件
/etc/yum.repos.d/目录存放的就是默认的repo文件。
执行yum时,它只会读取yum.repo.d下这个目录下的所有以.repo结尾的文件。
# 切换目录
[root@localhost ~]# cd /etc/yum.repos.d/
# 创建文件
[root@localhost yum.repos.d]# vi elastic.repo
# 内容
[elastic-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
- 安装
# 安装filebeat
[root@localhost yum.repos.d]# yum install filebeat -y
# 查看安装内容
[root@localhost ~]# rpm -ql filebeat-6.8.3
/etc/filebeat/filebeat.yml => 配置文件
/etc/init.d/filebeat => 启动脚本
/lib/systemd/system/filebeat.service => systemctl也可以启动
/usr/bin/filebeat => filebeat命令
# 启动filebeat
[root@localhost ~]# systemctl start filebeat
# 查看服务
[root@localhost ~]# ps -ef|grep filebeat
root 18018 1 0 10:39 ? 00:00:00 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat
root 18029 17568 0 10:39 pts/0 00:00:00 grep --color=auto filebeat
# 停止服务
[root@localhost ~]# systemctl stop filebeat
# 设置开机启动
[root@localhost ~]# chkconfig --add filebeat
- 配置
# 配置文件路径:/etc/filebeat/filebeat.yml
[root@localhost ~]# vi /etc/filebeat/filebeat.yml
# 内容
# 1. 输入
filebeat.inputs:
- type: log
# 更改为true以启用此输入配置。
enabled: true
# 应该爬网和获取的路径。基于全局的路径。
paths:
- /var/log/*.log
# fields表示自定义字段
#fields:
# level: debug
# review: 1
## 多行合并参数,正则表达式
#multiline.pattern: ^\[
## true 或 false;默认是false,匹配pattern的行合并到上一行;true,不匹配pattern的行合并到上一行
#multiline.negate: true
## after 或 before,合并到上一行的末尾或开头
#multiline.match: after
# 2. 搜索引擎
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["192.168.77.132:9200"]
# 默认情况下,Filebeat写事件到名为filebeat-6.4.0-yyyy.MM.dd的索引,其中yyyy.MM.dd是事件被索引的日期。
# 为了用一个不同的名字,你可以在Elasticsearch输出中设置index选项。
index: "%{[fields.log_type]}-%{[beat.version]}-%{+yyyy.MM.dd}"
# 使ILM(测试版)能够使用索引生命周期管理而不是每日索引。
#ilm.enabled: false
# 任择议定书和基本身份验证凭据。
#protocol: "https"
username: "elastic"
password: "xW9dqAxThD5U4ShQV1JT"
# 3. Kibana
setup.kibana:
host: "192.168.77.132:5601"
# username: "my_kibana_user"
# password: "{pwd}"
# 4. Logstash
#output.logstash:
# Logstash主机
#hosts: ["192.168.77.132:5044"]
主要配置项说明:
enabled:true 代表开启这个配置节
paths: 监控指定目录下的文件,支持模糊搜索
fields: 增加fields额外字段,本例在fields下面增加了app_id、log_type字段
multiline 多行日志监控,下面配置的意思是:不以时间格式开头的行都合并到上一行的末尾(正则写的不好,忽略忽略)
pattern:正则表达式
negate:true 或 & false;默认是false,匹配pattern的行合并到上一行;true,不匹配pattern的行合并到上一行
match:after 或 before,合并到上一行的末尾或开头
output.elasticsearch 配置host指定搜索引擎地址
四、启动测试
# 1. 启动es 2. 启动kiaba
# 启动filebeat
[root@localhost kibana-6.4.3-linux-x86_64]# systemctl start filebeat
五、采集SpringBoot日志
- 构建日志(定时输出日志)
@SpringBootApplication
@Slf4j
public class GoodsApplication {
Random random=new Random(10000);
public static void main(String[] args) {
SpringApplication.run(GoodsApplication.class, args);
new GoodsApplication().initTask();
}
private void initTask(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
log.info("seed:"+random.nextInt(999999));
}
},100,100, TimeUnit.MILLISECONDS);
}
}
- 然后在部署了filebeat的机器上部署该应用,应用的输出文件为/var/log/goods-service.log,应用启动命令如下:
[root@localhost ~]# nohup java -jar goods.1.0.0.jar > /var/log/goods-service.log 2>&1 &1
-
日志路径图