预热:基础知识
Beats是elastic公司的一款轻量级数据采集产品,它包含了几个子产品:
- packetbeat(用于监控网络流量)、
- filebeat(用于监听日志数据,可以替代logstash-input-file)、
- topbeat(用于搜集进程的信息、负载、内存、磁盘等数据)、
- winlogbeat(用于搜集windows事件日志)
Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息到elasticsearch或者logstarsh中存放。 以下是filebeat的工作流程:当你开启filebeat程序的时候,它会启动一个或多个探测器(prospectors)去检测你指定的日志目录或文件,对于探测器找出的每一个日志文件,filebeat启动收割进程(harvester),每一个收割进程读取一个日志文件的新内容,并发送这些新的日志数据到处理程序(spooler),处理程序会集合这些事件,最后filebeat会发送集合的数据到你指定的地点。
Harvester(收割机):负责读取单个文件内容。每个文件会启动一个Harvester,每个Harvester会逐行读取各个文件,并将文件内容发送到制定输出中。Harvester负责打开和关闭文件,意味在Harvester运行的时候,文件描述符处于打开状态,如果文件在收集中被重命名或者被删除,Filebeat会继续读取此文件。所以在Harvester关闭之前,磁盘不会被释放。默认情况filebeat会保持文件打开的状态,直到达到close_inactive(如果此选项开启,filebeat会在指定时间内将不再更新的文件句柄关闭,时间从harvester读取最后一行的时间开始计时。若文件句柄被关闭后,文件发生变化,则会启动一个新的harvester。关闭文件句柄的时间不取决于文件的修改时间,若此参数配置不当,则可能发生日志不实时的情况,由scan_frequency参数决定,默认10s。Harvester使用内部时间戳来记录文件最后被收集的时间。例如:设置5m,则在Harvester读取文件的最后一行之后,开始倒计时5分钟,若5分钟内文件无变化,则关闭文件句柄。默认5m)。
Prospector(勘测者):负责管理Harvester并找到所有读取源。
Prospector会找到/apps/logs/*目录下的所有info.log文件,并为每个文件启动一个Harvester。Prospector会检查每个文件,看Harvester是否已经启动,是否需要启动,或者文件是否可以忽略。若Harvester关闭,只有在文件大小发生变化的时候Prospector才会执行检查。只能检测本地的文件。
Filebeat如何记录文件状态:
将文件状态记录在文件中(默认在 /你的安装路径/filebeat-6.5.3-linux-x86_64/data/registry)。此状态可以记住Harvester收集文件的偏移量。若连接不上输出设备,如ES等,filebeat会记录发送前的最后一行,并再可以连接的时候继续发送。Filebeat在运行的时候,Prospector状态会被记录在内存中。Filebeat重启的时候,利用registry记录的状态来进行重建,用来还原到重启之前的状态。每个Prospector会为每个找到的文件记录一个状态,对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。
registry内容如下:offset日志文件读取偏移量,看到这些信息你是不是大概明白了呢
[{"source":"/usr/local/logs/catalina-test.out","offset":4214960,"timestamp":"2018-12-20T20:06:26.992531352+08:00","ttl":-1,"type":"log","meta":null,"FileStateOS":{"inode":675369,"device":64769}},
{"source":"/usr/local/logs/catalina.out","offset":4215010,"timestamp":"2018-12-20T20:16:15.464056254+08:00","ttl":-1,"type":"log","meta":null,"FileStateOS":{"inode":675345,"device":64769}}]
Filebeat如何保证事件至少被输出一次:
Filebeat之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在文件中。在未得到输出方确认时,filebeat会尝试一直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会再关闭之前确认所有时事件。任何在filebeat关闭之前为确认的时间,都会在filebeat重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁用)。
1,安装
下载:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.3-linux-x86_64.tar.gz
解压:
tar -zxvf filebeat-6.5.3-linux-x86_64.tar.gz
2,配置
这里有一个简单的filebeat的配置文件filebeat.yml的样本,filebeat会使用很多默认的选项。
如果你想使用自己的输入配置,请一定要修改 enable: false 为 enable: true
基本配置步骤一:设置log path
paths:
- /usr/local/logs/*.out #爬取/usr/local/logs下面所有的 .out文件
- /usr/local/*/*.out #爬取/usr/local/下面的子文件夹的所有的 .out文件,不包括/usr/local下面
# 的*.out文件
注意:在预定义级别的子目录中获取所有文件,可以使用这个配置:/var/log/*/*.log,这会找到/var/log下所有子目录中所有的 以.log结尾的文件。但它并不会找到/var/log文件夹下的以.log结尾的文件。现在它还不能递归的在所有子目录中获取所有的日志文件。
基本配置步骤二:配置输出
filebeat支持多种输出,常见的有logstash,elasticsearch,kibana,kafaka。其中最常用的是到logstash做过滤与清洗,但中间层也可以添加kafaka做消息队列,是为了防止信息丢失,所以放在kafaka里面,redis 亦可
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["localhost:9200"]
# Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme"
#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"
如果指定输出为logstash,则在logstash的配置文件 logstash.conf 中需要配置
input {
beats {
port => 5044 # 此端口需要与 filebeat.yml 中的端口相同
}
}
更多配置步骤:https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.html
./filebeat -c filebeat.yml -e #指定配置文件路径启动
更多filebeat操作见:https://www.elastic.co/guide/en/beats/filebeat/6.5/index.html