推荐阅读
Helm3(K8S 资源对象管理工具)视频教程:https://edu.youkuaiyun.com/course/detail/32506
Helm3(K8S 资源对象管理工具)博客专栏:https://blog.youkuaiyun.com/xzk9381/category_10895812.html
本文原文链接:https://blog.youkuaiyun.com/xzk9381/article/details/114630076,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。
使用 filebeat 收集日志时,默认会添加一个 host.name 字段来标识主机,但是在主机名不是 IP 地址的情况下,这个字段不能很方便的针对 IP 地址进行筛选,所以需要在收集日志时,添加一个显示 IP 地址的字段。
添加字段可以使用 fields 模块,在这个模块下可以自定义字段,支持array ,数组等格式,也可以调用系统的环境变量:
filebeat.inputs:
- type: log
paths:
- /opt/test.log
scan_frequency: 10s
tail_lines: true
fields: # 使用 fields 模块添加字段
host_ip: ${SERVER_IP} # host_ip 为字段名称,后面的值为 SERVER_IP 变量值,该变量为系统变量
fields_under_root: true # 将新增的字段放在顶级,收集后字段名称显示 host_ip。如果设置为 false,则放在子集,收集后显示为 fields.host_ip
设置完成后,在 /etc/profile 中设置对应的环境变量,并在系统中生效。重启 filebeat 即可(需要在 kibana 中刷新索引模式)。
需要注意的是,如果重启 filebeat 是在本地执行的,那么 filebeat 可以正常获取到系统变量名称。但是如果是在其他机器 ssh 远程执行命令来重启 filebeat,则有可能会导致 filebeat 启动失败。
例如我当前的 filebeat 测试环境中,是通过跳板机中远程执行重启 filebeat 的命令:
bash /opt/filebeat-7.3.0/filebeat.sh ES-135cd3ec-d7ca-11ea-b08e-b496912687c4_15528.yml restart
filebeat.sh 脚本用于根据配置文件启动 filebeat,可以自行编写
但是在使用系统变量的情况下,filebeat 远程重启失败,查看 filebeat 日志发现如下报错:
Exiting: Error while initializing input: missing field accessing 'filebeat.inputs.0.fields.host_ip' (source:'/opt/filebeat-7.3.0/conf/ES-135cd3ec-d7ca-11ea-b08e-b496912687c4_15520.yml')
出现这个问题是由于 filebeat 无法加载环境变量,而导致无法加载环境变量的原因是远程执行 shell 命令时,是属于非交互非登陆的shell。对于这种模式而言,它会去寻找环境变量 BASH_ENV
,将变量的值作为文件名进行查找,如果找到便加载它,但是系统中一般都没有设置这个变量值,所以就无法加载环境变量。
解决这个问题最简单的方式是在执行脚本时,添加 -l 选项,就会打开一个login shell,这样可以加载全局的环境变量配置文件 /etc/profile。之前设置的变量也就会生效了。所以将原来的命令修改为如下:
bash -l /opt/filebeat-7.3.0/filebeat.sh ES-135cd3ec-d7ca-11ea-b08e-b496912687c4_15528.yml restart
本文原文链接:https://blog.youkuaiyun.com/xzk9381/article/details/114630076,转载请注明出处。如有发现文章中的任何问题,欢迎评论区留言。