본문 바로가기
Programming/검색엔진

filebeat를 사용하여 logstash로 파일 수집하기

by ★용호★ 2017. 3. 10.

설치 과정은 여기에 잘 정리되어 있으므로 생략.


Logstash로 전달하기 위한 설정

  • filebeats는 file에 저장된 로그 데이터를 실시간으로 수집하여 logstash로 전달한다.
    • 파일이 추가되거나 변경되면 실시간으로 logstash에 반영한다.
  • filebeat.yml 설정
    • 기본적으로 설정되어 있는 elastic 부분을 모두 주석 처리하고 logstash를 활성화 시킨다.
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
  # Array of hosts to connect to.
  #hosts: ["localhost:9200"]

  # Optional protocol and basic auth credentials.
  #protocol: "https"
  #username: "elastic"
  #password: "changeme"

#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]

  # Certificate for SSL client authentication
  #ssl.certificate: "/etc/pki/client/cert.pem"

  # Client Certificate Key
  #ssl.key: "/etc/pki/client/cert.key"
  • 읽어들일 파일이 있는 위치를 지정한다.
paths:
    - /home/yongho/test/*.log
  • 실행
$ ./filebeat -e -c filebeat.yml


filebeat 사용 시 주의해야할 사항들

  • filebeat는 inode를 저장하여 파일을 식별하기 때문에 inode를 변경하면 파일이 이미 처리되었는지 여부를 알기가 어렵다.
  • filebeat를 사용하여 파일을 전송하면 내부적으로 offset 정보를 저장하고 있기 때문에 중간에 crash가 나더라도 이어서 전송이 가능.
    • 디버그 모드로 수행할 경우 offset 확인 가능
    filebeat -c filebeat.yml -e -d "*"
    
  • Filebeat는 거의 실시간으로 새 로그 행을 읽을 수 있도록 파일 끝에 도달하면 파일 핸들러를 열어 두기 때문에 Filebeat에서 많은 수의 파일을 수집하는 경우 열려있는 파일 수가 문제가 될 수 있다.

    • registry_file에 각 파일의 상태를 유지한다. 이 파일 상태는 Filebeat가 다시 시작될 때 이전 위치에서 파일 읽기를 계속하는 데 사용되는데 많은 수의 새 파일이 생성되면 레지스트리 파일이 너무 커질 수 있다. 레지스트리 파일의 크기를 줄이기 위해 clean_removed와 clean_inactive라는 두 가지 구성 옵션을 사용.
    • registry 위치는 /var/lib/filebeat/registry
    • registry의 정보는 아래와 같다.
    {
    "/home/hive/out.txt": {
      "source": "/home/hive/out.txt",
      "offset": 455871447,
      "FileStateOS": {
        "inode": 58984638,
        "device": 2050
      }
    },
    "/var/log/alternatives.log": {
      "source": "/var/log/alternatives.log",
      "offset": 564,
      "FileStateOS": {
        "inode": 183238936,
        "device": 2050
      }
    },
    "/var/log/auth.log": {
      "source": "/var/log/auth.log",
      "offset": 247149,
      "FileStateOS": {
        "inode": 183246197,
        "device": 2050
      }
    },
    "/var/log/boot.log": {
      "source": "/var/log/boot.log",
      "offset": 3431,
      "FileStateOS": {
        "inode": 183238696,
        "device": 2050
      }
    },
    "/var/log/dpkg.log": {
      "source": "/var/log/dpkg.log",
      "offset": 20465,
      "FileStateOS": {
        "inode": 183238885,
        "device": 2050
      }
    },
    "/var/log/fontconfig.log": {
      "source": "/var/log/fontconfig.log",
      "offset": 1521,
      "FileStateOS": {
        "inode": 183241893,
        "device": 2050
      }
    },
    "/var/log/kern.log": {
      "source": "/var/log/kern.log",
      "offset": 6505,
      "FileStateOS": {
        "inode": 183240875,
        "device": 2050
      }
    },
    "/var/log/mail.log": {
      "source": "/var/log/mail.log",
      "offset": 75167,
      "FileStateOS": {
        "inode": 183246196,
        "device": 2050
      }
    },
    "/var/log/ufw.log": {
      "source": "/var/log/ufw.log",
      "offset": 0,
      "FileStateOS": {
        "inode": 183240877,
        "device": 2050
      }
    }
    }
    
  • Linux 파일 시스템에서 Filebeat는 inode와 device 값을 사용하여 파일을 식별한다. 디스크에서 파일을 제거하면 파일 순환에 의해 제거된 inode 값과 동일한 값을 새로 생성된 파일이 할당받을 수 있다. 이 경우에 Filebeat는 registry에 기록된 정보에 의해 동일한 파일로 간주하고 이전 위치에서 읽으려고 시도하기 때문에 문제가 될 소지가 있다. 기본적으로 registry에 기록된 상태 정보는 절대 제거되지 않기 때문에 inode 재사용 문제를 해결하려면 clean_ * 옵션, 특히 clean_inactive를 사용하여 비활성 파일의 상태를 제거하는 것이 좋다. 디스크에서 제거 된 파일에 대해서는 clean_removed를 사용할 수 있다. clean_removed는 스캔 중에 파일을 찾을 수 없을 때마다 레지스트리에서 파일 상태를 정리하고, 나중에 동일한 파일이 생성되면 처음부터 다시 전송된다.

  • Filebeat의 CPU 점유율이 높은 경우 파일을 너무 자주 검색하도록 설정 되었을 수 있다. filebeat.yml 파일에서 scan_frequency 값을 체크하여 1 미만인 경우 조정.

  • Filebeat는 개행 문자를 사용하여 이벤트의 끝을 감지하기 때문에 수집 중인 파일의 끝에 개행이 있지 않는 경우 마지막 행을 읽지 않으므로 주의.

  • 다음 Linux 명령은 포트 5044를 통한 TCP 연결에서 제한을 50kbps로 설정하여 Filebeat와 Logstash 간의 연결을 제한할 수 있다.

tc qdisc add dev $DEV root handle 1: htb
tc class add dev $DEV parent 1:1 classid 1:10 htb rate 50kbps ceil 50kbps
tc filter add dev $DEV parent 1:0 prio 1 protocol ip handle 10 fw flowid 1:10
iptables -A OUTPUT -t mangle -p tcp --dport 5044 -j MARK --set-mark 10
  • logstash의 outputs는 @metadata 필드를 자동으로 제거한다. 필드를 보존하고 싶은 경우 Logstash mutate 필터를 사용하여 필드의 이름을 변경.

  • 파일을 logstash로 수집하지 않고 filebeat를 사용하는 이유는?

    • filebeat는 Logstash보다 시스템 공간과 사용 공간이 적다. 즉, logstash를 사용하는 경우가 리소스를 더 소비한다. 하지만 Logstash는 다양한 소스에서 데이터를 수집할 수 있고 다양한 플러그인을 제공.


참고


댓글