Filebeat 收集日志时如何添加 IP 地址字段(引用变量)

本文原文链接:https://blog.csdn.net/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.csdn.net/xzk9381/article/details/114630076

猜你喜欢

转载自blog.csdn.net/xzk9381/article/details/114630076