코알못

[로그수집] 서비스 별로 다른 저장소에 로그를 적재하고 싶다면 ? 본문

BIG DATA

[로그수집] 서비스 별로 다른 저장소에 로그를 적재하고 싶다면 ?

코린이s 2022. 2. 21. 23:19
728x90

서비스 별로 로그가 있는 서버에 파일비트를 설치하여 수집하고 logstash 에 로그를 모을 것이다.

그리고 logstash 에서 원하는곳을 하나 또는 그 이상을 지정하여 보낼것이다.

이때, 로그를 서비스 별로 다른곳에 보내고 싶다면 어떻게 해야할까?

결론, 서비스별로 분기처리 가능하다.

그럼 kafka 로 로그 데이터를 넘길시 서비스 별로 토픽을 따로 따야 할까 ?

저자 생각으로는 서비스 별로 토픽을 추가하는 방식으로 간다면

서비스가 추가 될때마다 토픽을 따는 작업과, logstash 분기 처리 하는 작업이 필요하여 관리에 대한 공수가 커진다.

그렇기에 지금은 하나의 토픽으로 관리하되, 필요시에 추가하는 방향으로 가는것이 (수정이 어렵지 않고 이슈도 없어 보여) 좋을 것 같다.   

실습은 아래와 같이 진행했다

파일비트를 세개 띄워 실습할 예정이기에 config 파일 3개를 만든다.

// 파일 비트 구분값 없는 설정

$ vi filebeat-7.6.0-linux-x86_64/filebeat.yml
#fields:
#  type:

// 파일 비트 구분값 'es' 설정

$ vi filebeat-7.6.0-linux-x86_64/filebeat_es.yml
fields:
  type: es

// 파일 비트 구분값 'kafka' 설정

 

$ vi filebeat-7.6.0-linux-x86_64/filebeat_kafka.yml
fields:
  type: kafka

 

logstash 의 경우 아래와 같이 if 문을 넣어 type 별 분기 처리 한다.

input {
	beats {
		port => 5044
		host => "0.0.0.0"
	}
}
#filter {
#	mutate {
#		gsub => ["message","'",""""]
#	}
#}
output {
	if [fields][type] == "es" {
		elasticsearch{
                	hosts => "genie-hong-06"
                	index => "servicelog-%{+yyyy.MM.dd}"
		}
        }else if [fields][type] == "kafka" {
		kafka {
                	bootstrap_servers => "kafka-01:9092,kafka-02:9092,kafka-03:9092"
                	#codec => json
                	codec => line { format => "%{message}"}
                	topic_id => "logstash-test"
      		}
	}
	stdout{
		codec => dots
	}
	#elasticsearch{
		#hosts => "genie-hong-06"
		#index => "servicelog-%{+yyyy.MM.dd}"
	#}
	#kafka {
        	#bootstrap_servers => "kafka-01:9092,kafka-02:9092,kafka-03:9092"
        	#codec => json
		#codec => line { format => "%{message}"}
        	#topic_id => "logstash-test"
      #}
}

파일 비트를 서비스 별로 실행 시켜본다.

./filebeat -c filebeat.yml --path.data /home/ec2-user/lib/filebeat-7.6.0-linux-x86_64/data

// 콘솔 로그 찍힘

// es 데이터 없음

// s3 (kafka) 데이터 없음

./filebeat -c filebeat_es.yml --path.data /home/ec2-user/lib/filebeat-7.6.0-linux-x86_64/data_es

// 콘솔 로그 찍힘

// es 데이터 존재

// s3 (kafka) 데이터 없음

./filebeat -c filebeat_kafka.yml --path.data /home/ec2-user/lib/filebeat-7.6.0-linux-x86_64/data_kafka

// 콘솔 로그 찍힘

// es 데이터 없음

// s3 (kafka) 데이터 존재

logstash를 하나 이상의 서버에서 운영하더라도

위와 같이 쉽게 서비스별 원하는 최종 저장소로 넘겨줄수 있으며

아래와 같이 로그자체에도 해당 필드값이 넘어가도록 할 수있어(필터로 거르지 않을시) 

최종 저장소에서도 서비스 로그별로 원하는 처리를 할 수 있다.

끝!  

728x90
Comments