zoukankan      html  css  js  c++  java
  • filebeat自动获取ip

    默认情况下filebeat只能获取本机的host,不能将本机的ip传递到logstash,但是机器的主机名会变化,或者通过克隆的方式产生的机器的主机名都一样,改主机名比较麻烦,这就造成查看日志的时候不能分辨日志来自哪台机器,极大的影响了问题的排查。
    但是直接用系统环境变量会出现以下问题:CRIT Exiting: error loading states for prospector 0: missing field accessing

    前提

    • OS: centos 7+
    • filebat的启动方式是systemd,且内容为下:
    [Unit]
    Description=filebeat
    Documentation=https://www.elastic.co/guide/en/beats/filebeat/current/index.html
    Wants=network-online.target
    After=systemd-setenv.service
    
    [Service]
    ExecStart=/usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat_nodejs.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat_nodejs -path.logs /var/log/filebeat_nodejs
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    ** 注意Unit里面的After **

    • 加入开机自启:
    systemctl daemon-reload
    systemctl enable filebeat.service
    

    配置

    配置环境变量

    编辑/usr/lib/systemd/system/systemd-setenv.service

    [Unit]
    Description=Transfers /etc/environment to systemd
    Requires=network-online.target
    After=network-online.target
    
    [Service]
    ExecStart=/usr/bin/bash -c "/usr/bin/systemctl set-environment SERVER_IP=`ip a | grep inet  | grep brd  | grep -v docker | awk -F '[ |/]+' '{print $3}'`"
    
    [Install]
    WantedBy=multi-user.target
    

    加入开机自启:

    systemctl daemon-reload
    systemctl enable systemd-setenv.service
    

    原理

    默认情况下系统的环境变量只有通过pam方式登录的用户才能读取到,但是systemd是不会进行登录的,所以就不能直接读取到系统的环境变量,但是可以通过systemctl import-environment var=value 或者 systemctl set-environment var=valua 方式给systemd配置环境变量,前者是直接导入系统的环境变量,后者是自定义,但是systemd不提供任何永久性的东西,上面的配置只是临时的,再系统重启之后就会消失。
    所以针对上面的问题,需要再开机启动的时候加环境变量导入,现在又有另外2个问题:

    • 怎么才能在服务器启动的时候获取到正确的服务器ip
    • 怎么固定我们需要的顺序即:ip--> 变量 --> 服务

    针对上面的两个问题我们根据systemd的特性做了上面的配置/usr/lib/systemd/system/systemd-setenv.service,首先我们可以看到它的systemd的启动脚本中有After=network-online.target,这就意味在我们的服务启动是在网络启动好之后,再看filebeatsystemd启动脚本中有After=systemd-setenv.service,意味着它是再环境变量导入之后进行的,所以可以保证filebeat通过systemd启动的时候可以读到环境变量
    下面是filebeat.yml的内容:

    filebeat.prospectors:
    - type: log
      enabled: true
      paths:
        - /var/log/*.log
      fields:
        hostIp: ${SERVER_IP}
      fields_under_root: true
      tail_files: true
      exclude_lines: ["goreplay=1"]
      scan_frequency: 5s
      close_inactive: 1m
      max_bytes: 104857600
      harvester_buffer_size: 163840 
      ignore_older: 2h
      backoff: 1s
      max_backoff: 5s
    
    output.logstash:
      hosts: ["0.0.0.0:5046"]
      bulk_max_size: 8192
      pipelining: 10
      worker: 6
    
    #
    #
    filebeat.registry_file: /var/lib/filebeat/nodejs_registry
    

    systemd中文教程

    以上

  • 相关阅读:
    吴恩达深度学习笔记 course2 week1 作业1
    吴恩达深度学习笔记 course2 week1 测验
    吴恩达深度学习笔记 course 2 1.1~1.14 深度学习的实用层面
    吴恩达深度学习笔记第四章作业2
    开发中经常遇到SVN清理失败的问题:
    UE4编程之C++创建一个FPS工程(一)创建模式&角色&处理输入
    Unreal Engine 4 C++ UCLASS构造函数易出错分析
    光照构建失败。Swarm启动失败
    ue4 C++ 生成并弹出一个菜单
    解决SVN Cleanup错误: Failed to run the WC DB work queue associated with
  • 原文地址:https://www.cnblogs.com/chengjiawei/p/15576590.html
Copyright © 2011-2022 走看看