filebeat
介绍
filebeat中message要么是一段字符串,要么在日志生成的时候拼接成json然后在filebeat中指定为json。但是大部分系统日志无法去修改日志格式,filebeat则无法通过正则去匹配出对应的field,这时需要结合logstash的grok来过滤,所以filebeat只负责在服务器上收索转发日志数据,过滤功能则交给logstash来处理。
Filebeat更加的轻量级,Logstash占用更多的系统资源,如果在每个服务器上部署Logstash,有时候会影响到业务服务,导致服务响应缓慢;
Filebeat能够记录文件状态,文件状态记录在文件中(~FILEBEAT_HOME/data/registry)。此状态可以记住harvesters 收集文件的偏移量,重启后prospectors 能知道每个日志文件的记录状态再进行收集文件;
Filebeat保证至少有一次输出,因为Filebeat将每个事件的传递状态保存在文件中。在没有得到接收方确认时,会尝试一直发送,直到得到回应。
beat6.0之前可以配置多个输出。
配置文件及说明
filebeat.yml
filebeat.inputs:
- type: log
paths: # 这里是容器内的path
- /var/lib/docker/containers/*/*.log
json.keys_under_root: true # 因为docker使用的log driver是json-file,因此采集到的日志格式是json格式,设置为true之后,filebeat会将日志进行json_decode处理
json.overwrite_keys: true
json.add_error_key: true #如果启用此设置,则在出现JSON解组错误或配置中定义了message_key但无法使用的情况下,Filebeat将添加“error.message”和“error.type:json”键。
json.message_key: log #一个可选的配置设置,用于指定应用行筛选和多行设置的JSON密钥。 如果指定,键必须位于JSON对象的顶层,且与键关联的值必须是字符串,否则不会发生过滤或多行聚合。
tail_files: true #每次从尾部开始检测
multiline.pattern: '^\d{4}-\d{1,2}-\d{1,2}' #合并错误日志
multiline.negate: true
multiline.match: after
multiline.timeout: 10s
processors:
- drop_fields:
fields: ["prospector","source","input", "beat", "offset","tags","host"]
- decode_json_fields:
fields: ['message'] #要进行解析的字段
target: "" #json内容解析到指定的字段,如果为空(“”),则解析到顶级结构下
overwrite_keys: true #如果解析出的json结构中某个字段在原始的event(在filebeat中传输的一条数据为一个event)中也存在,是否覆盖event中该字段的值,默认值:false
#process_array: false #数组是否解码,默认值:false
#max_depth: 1 #解码深度,默认值:1
#output.file: #输出到文件
# path: "/tmp"
# filename: "filebeat_test.txt"
output:
logstash: # 我这里是输出到logstash
hosts: ["logstash:5044"] #
json.message_key 根据具体设置的key,对此内容进行json化,但解析后,保存日志完整内容的message字段(也即完整的json串)消失了,解决方法加入decode_json_fields
@version,@timestamp等filebeat自带字段在脚本里无法drop_fields,具体删除可在logstash里进行处理
scan_frequency: 50 #扫描间隔,单位为秒;设置太小会引起filebeat频繁扫描文件,导致cpu占用百分比过高
-
filebeat输入设置
#============== Filebeat prospectors =========== filebeat.inputs: # 6.3以前是 filebeat.prospectors: - type: log # 默认为log 。6.0以前配置是 - input_type: log
filebeat 探测器读取日志行数文件位于 /usr/share/filebeat/data/registry(6x版本与7x不同,7x改路径为文件夹,6x为文件),filebeat服务运行请设置管理员权限。
Filebeat 用处理器(processors)实现了类似 Logstash 中 filter 的功能
常用的 processors:
- add_cloud_metadata:添加云服务器的 meta 信息;
- add_locale:添加本地时区;
- decode_json_fields:解析并处理包含 Json 字符串的字段;
- drop_event:丢弃符合条件的消息事件;
- drop_fields:删除符合条件的字段;
- include_fields:选择符合条件的字段;
- rename:字段重命名;
- add_kubernetes_metadata:添加 k8s 的 meta 信息;
- add_docker_metadata:添加容器的 meta 信息;
- add_host_metadata:添加操作系统的 meta 信息;
- dissect:类似与 gork 的正则匹配字段的功能;
- dns:配置 filebeat 独立的 dns 解析方式;
- add_process_metadata:添加进程的元信息。
metricbeat
metricbeat可以监控服务器的CPU使用率、内存使用情况、线程数等机器物理性能,类似于Windows的资源管理器功能。而且内部自带docker,nginx,mysql,redis等监控模块方便使用。
metricbeat.yml
metricbeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
#output.file:
# path: '/tmp'
# filename: 'test'
output.elasticsearch:
#hosts: ['127.0.0.1:9200']
hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
setup.kibana:
host: "11.23.254.120:5601"
setup.dashboards.enabled: true #设置metricbeat自带模板,导入kibana仪表盘
- metricbeat modules enable xxx.yml.disabled 激活相关配置,其实直接改后缀名也可
- metricbeat.reference.yml 官方demo配置文档
docker启动脚本
#!/bin/bash
docker service rm metricbeat
docker service create \
--name metricbeat \
-u root \
--network wushan \
--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
--mount type=bind,source="$(which docker)",target="$(which docker)" \
--mount type=bind,source=/usr/lib64/libltdl.so.7,target=/usr/lib64/libltdl.so.7 \
--mount type=bind,source="$(pwd)"/config/metricbeat.yml,target=/usr/share/metricbeat/metricbeat.yml \
--mount type=bind,source="$(pwd)"/modules.d,target=/usr/share/metricbeat/modules.d \
--replicas 3 \
docker.elastic.co/beats/metricbeat:6.7.2
-
metricbeat作为docker内部容器,要获取docker的相关运行信息必须实现以下两个绑定
--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock
--mount type=bind,source="(which docker)" -
必须赋予metricbeat服务管理员权限
-u root
其他说明
在具有POSIX文件权限的系统上,所有Beats配置文件都受到所有权和文件权限检查。 这些检查的目的是防止未经授权的用户提供或修改由Beat运行的配置。 配置文件的所有者必须是root用户或执行Beat进程的用户。 每个文件的权限必须禁止所有者以外的任何人写入。
当通过RPM或DEB软件包安装时,/etc/{beatname}/{beatname}.yml中的配置文件将具有正确的所有者和权限。 该文件由root拥有,文件权限为0644(-rw-r - r--)。
如果配置文件未能通过这些检查,可能会遇到以下错误:
Exiting: error loading config file: config file ("{beatname}.yml") must be owned by the beat user (uid=501) or root
若要更正此问题,可以使用chown root {beatname} .yml或chown 501 {beatname} .yml来更改配置文件的所有者。
Exiting: error loading config file: config file ("{beatname}.yml") can only be writable by the owner but the permissions are "-rw-rw-r--" (to fix the permissions use: 'chmod go-w /etc/{beatname}/{beatname}.yml')
要解决此问题,请使用chmod go-w /etc/{beatname}/{beatname}.yml删除除所有者以外的任何人的写入权限。其他配置文件(如modules.d目录中的文件)受到相同的所有权和文件权限检查。