1 filestream介绍
官方宣布:输入类型为log在filebeat7.16版本已经弃用了
Filestream 是 Filebeat 中的一种 输入类型(Input),用于处理日志文件的读取。它是为了取代 Filebeat 中传统的 log 输入(Input)设计的,更加现代化和高效
-
filestream
直接与操作系统的文件系统事件接口(如 Linux 的inotify
或 Windows 的ReadDirectoryChangesW
)集成,从而更高效地监听文件变化 -
专为处理容器化环境或日志动态生成的场景设计,能够动态追踪日志文件的创建和删除
-
使用唯一的文件标识符(如 inode + dev)而非文件路径,避免因路径变化导致日志丢失或重复采集
-
未来版本中,
filestream
将成为日志文件采集的首选,逐步取代log
输入
2 filestream解析nginx json日志
1.filebeat执行该文件
cat > 11-filestream-to-es.yaml <<EOF
filebeat.inputs:
- type: filestreampaths:- /var/log/nginx/access.log# 配置解析parsers:# 解析json格式- ndjson:# 将解析的数据放在哪个字段,若为""代表放在顶级字段中target: ""# 对哪个字段进行解析,若不指定,则默认会对message字段进行解析,并删除该字段。message_key: messageoutput.elasticsearch:hosts: - "http://10.0.0.91:9200"- "http://10.0.0.92:9200"- "http://10.0.0.93:9200"index: "zhiyong18-luckyboy-log-filestream-nginx"setup.ilm.enabled: false
setup.template.name: "zhiyong18-luckyboy"
setup.template.pattern: "zhiyong18-luckyboy-log*"
setup.template.overwrite: false
setup.template.settings:index.number_of_shards: 5index.number_of_replicas: 0
EOF
2.索引可以正常创建,discover 中看到内容和 之前的 nginx json 格式采集一样
3 filestream多行匹配
1.filebeat执行该文件
cat > 12-filestream_multiple-to-es.yaml <<EOF
filebeat.inputs:
- type: filestreampaths:- /app/apache-tomcat-10.1.25/logs/catalina.outparsers:- multiline:type: patternpattern: '^\d{2}'negate: truematch: afteroutput.elasticsearch:hosts: - "http://10.0.0.91:9200"- "http://10.0.0.92:9200"- "http://10.0.0.93:9200"index: "zhiyong18-luckyboy-log-filestream-tomcat-errorlog"setup.ilm.enabled: false
setup.template.name: "zhiyong18-luckyboy"
setup.template.pattern: "zhiyong18-luckyboy-log*"
setup.template.overwrite: false
setup.template.settings:index.number_of_shards: 5index.number_of_replicas: 0
EOF
2.验证采集的错误日志
4 filestream count多行匹配+json采集
1.准备测试文件 /tmp/apps.json
{"name": "韩V童","hobby": ["下海","睡觉","抽奖"]
}
{"name": "康Z阳","hobby": ["看美女","打游戏","学习"]
}
2.编写测试 filebeat 采集配置。
注意:如果这条索引同时匹配到了多个索引模版,可能就会报错。建议修改匹配模式
cat > 13-filestream_json_multiple_line-to-es.yaml <<EOF
filebeat.config.modules:# 注意,此处的"${path.config}"对应的路径是/etc/filebeat目录path: ${path.config}/modules.d/*.yml# 支持热加载reload.enabled: true# 指定每间隔多长时间检测一次“${path.config}/modules.d/*.yml”reload.period: 5soutput.elasticsearch:hosts: - "http://10.0.0.91:9200"- "http://10.0.0.92:9200"- "http://10.0.0.93:9200"index: "zhiyong18-luckyboy-log-modules-nginx"etup.ilm.enabled: false
setup.template.name: "zhiyong18-luckyboy-modules"
setup.template.pattern: "zhiyong18-luckyboy-log-modules*"
setup.template.overwrite: false
setup.template.settings:index.number_of_shards: 5index.number_of_replicas: 0
EOF
3.查看采集到的日志
5 filebeat模块介绍
filebeat模块是官方提供的一种对各种中间件进行日志采集的解决方案,用于简化常见服务(如 NGINX、MySQL、Apache 等)日志的采集、解析和可视化过程。
-
模块在/etc/filebeat/modules.d/ 下, 启用模块本质上是将 /etc/filebeat/modules.d/ 目录下的
*.yml.disabled
文件更名为*.yml
-
filebeat启用,禁用和查看模块
# 查看支持的模块
[root@elk91 filebeat]# ll modules.d/ | egrep "tomcat|nginx"
-rw-r--r-- 1 root root 784 May 30 21:52 nginx.yml.disabled
-rw-r--r-- 1 root root 623 May 30 21:52 tomcat.yml.disabled# 进行模块开启操作
[root@elk91 filebeat]# filebeat modules enable nginx tomcat
Enabled nginx# 查看已开启的模块
[root@elk91 filebeat]# ll modules.d/ | egrep "tomcat|nginx"
-rw-r--r-- 1 root root 784 May 30 21:52 nginx.yml
-rw-r--r-- 1 root root 623 May 30 21:52 tomcat.yml# 禁用模块
[root@elk91 filebeat]# filebeat modules disable nginx tomcat
模块大全:
[root@elk93~]# ls /etc/filebeat/modules.d/
activemq.yml.disabled cyberark.yml.disabled infoblox.yml.disabled nginx.yml snyk.yml.disabled
apache.yml.disabled cylance.yml.disabled iptables.yml.disabled o365.yml.disabled sonicwall.yml.disabled
auditd.yml.disabled envoyproxy.yml.disabled juniper.yml.disabled okta.yml.disabled sophos.yml.disabled
awsfargate.yml.disabled f5.yml.disabled kafka.yml.disabled oracle.yml.disabled squid.yml.disabled
aws.yml.disabled fortinet.yml.disabled logstash.yml.disabled osquery.yml.disabled suricata.yml.disabled
azure.yml.disabled gcp.yml.disabled microsoft.yml.disabled panw.yml.disabled system.yml.disabled
barracuda.yml.disabled googlecloud.yml.disabled misp.yml.disabled pensando.yml.disabled threatintel.yml.disabled
bluecoat.yml.disabled google_workspace.yml.disabled mongodb.yml.disabled postgresql.yml.disabled tomcat.yml
cef.yml.disabled gsuite.yml.disabled mssql.yml.disabled proofpoint.yml.disabled traefik.yml.disabled
checkpoint.yml.disabled haproxy.yml.disabled mysqlenterprise.yml.disabled rabbitmq.yml.disabled zeek.yml.disabled
cisco.yml.disabled ibmmq.yml.disabled mysql.yml.disabled radware.yml.disabled zookeeper.yml.disabled
coredns.yml.disabled icinga.yml.disabled nats.yml.disabled redis.yml.disabled zoom.yml.disabled
crowdstrike.yml.disabled iis.yml.disabled netflow.yml.disabled santa.yml.disabled zscaler.yml.disabled
cyberarkpas.yml.disabled imperva.yml.disabled netscout.yml.disabled snort.yml.disabled
6 使用模块采集nginx日志
前提: nginx 模块已经开启,nginx日志是常规格式
1.修改nginx模块配置
cat > /etc/filebeat/modules.d/nginx.yml <<EOF
- module: nginxaccess:enabled: truevar.paths: ["/var/log/nginx/access.log*"]error:enabled: truevar.paths: ["/var/log/nginx/error.log*"]ingress_controller:enabled: false
EOF
2.filebeat执行该文件。
可能遇到的故障:
- 由于之前创建了大量索引模式,可能会导致索引匹配冲突,要么改优先级或匹配其他索引。
- 索引模式冲突举例:
zhiyong18-luckyboy-log*
和zhiyong18-luckyboy-log-modules*
- 索引模式冲突举例:
- vim access.log 后日志不采集,或这不写入。需要重启nginx
cat > 14-modules_nginx-to-es.yaml <<'EOF'
filebeat.config.modules:# 注意,此处的"${path.config}"对应的路径是/etc/filebeat目录path: ${path.config}/modules.d/*.yml# 支持热加载reload.enabled: true# 指定每间隔多长时间检测一次“${path.config}/modules.d/*.yml”reload.period: 5soutput.elasticsearch:hosts: - "http://10.0.0.91:9200"- "http://10.0.0.92:9200"- "http://10.0.0.93:9200"index: "zhiyong18-luckyboy-log-modules-nginx"# 禁用索引的生命周期(Index Lifecycle Management,简称"ilm"),如果不禁用则忽略自定义索引名称
setup.ilm.enabled: false
# ES的索引模板名称,和ES最好别冲突
setup.template.name: "zhiyong18-luckyboy-modules"
# ES索引模板的匹配模式
setup.template.pattern: "zhiyong18-luckyboy-log*"
# 如果索引模板已经存在,是否覆盖,推荐设置为false
setup.template.overwrite: false
EOF
"source": {"geo": {"continent_name": "Africa","country_iso_code": "SC","country_name": "Seychelles","location": {"lon": 55.6667,"lat": -4.5833}},
3.去 discover 查看,官方模块非常详细,把日志中隐藏的国家、IP、状态码都显示出来了
7 nginx模块中经纬度混合问题
1.在使用了nginx模块采集原生nginx日志后,若发现地理位置坐标点全在一个字段中,无法确定其地理位置坐标点。需要使用数据映射。
下图为正确的示例,地理位置正确映射
2.创建一条索引模式,以后使用nginx模块采集日志时就匹配这条索引
索引名称 | zhiyong18-luckyboy-modules |
索引模式 | zhiyong18-luckyboy-log* |
3.索引设置:
{"number_of_shards": 3,"number_of_replicas": 0
}
4.设置数据映射:source.geo.location
--> 地理位置坐标点
5.创建后预览:
{"template": {"settings": {"index": {"number_of_shards": "3","number_of_replicas": "0"}},"mappings": {"properties": {"source": {"properties": {"geo": {"properties": {"location": {"type": "geo_point"}}}}}}},"aliases": {}}
}
最后,创建地图查看分布图
最后,创建地图查看分布图