설치 과정은 여기에 잘 정리되어 있으므로 생략.
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는 다양한 소스에서 데이터를 수집할 수 있고 다양한 플러그인을 제공.
참고
'Programming > 검색엔진' 카테고리의 다른 글
로그스태시는 장애 시 어떻게 데이터 손실을 방지할까? (0) | 2017.12.12 |
---|---|
ELK에 Search Guard 적용 (3) | 2017.07.14 |
[ELK] logback에서 설정한 시간 포맷과 ELK 시간 포맷 동기화 (0) | 2017.04.25 |
ELK 구성 노트 (0) | 2017.03.18 |
댓글