본문 바로가기

리눅스 인프라/ElasticStack

ELK 통해서 Spring Server Log 모으기, ELK 기본 설정

관련 내용

해당 프로젝트 깃허브

ELK란, ELK의 특징과 인기 이유

개요와 목적

이 글에서는 ELK를 사용하여, 여러 서버에서 발생하는 로그 메세지를 Elastic Search와 Kibana가 있는 하나의 서버로 모으는 방법에 대해서 설명한다.

현재 VirtualBox의 서버의 상황은 아래 그림과 같다.

개발 환경

  • SpringBoot(gradle) - 2.7.5
  • Ubuntu - 20.04
  • OpenJdk - 11
  • ELK - 7.17

Spring Server와 LogStash 연결하기

Spring Server 설정

Build.gradle 의존성 추가

implementation group: 'net.logstash.logback', name: 'logstash-logback-encoder', version: '7.0.1'

logback.xml 파일 설정

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false">
  
	<!--  ELK-->
  <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>127.0.0.1:4560</destination>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder"></encoder>
  </appender>

  <root level="info">
    <appender-ref ref="LOGSTASH"/>
  </root>
</configuration>

로그 설정을 logback.xml 파일로 위임하고, Logstash appender를 설정하고, 적용한다.

#application.yml에서 logback.xml 파일로 로그 설정을 위임하는 방법

logging:
  config: classpath:logback.xml

Ubuntu Logstash 다운 및 설정

다운

우분투 서버에 logstash를 다운 받기 위해서, https://www.elastic.co/guide/en/logstash/7.17/installing-logstash.html을 참고하여, APT 다운을 시도 하였다.

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb <https://artifacts.elastic.co/packages/7.x/apt> stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt-get update
apt-get install logstash -y

구성 파일 설정

#설정 파일 생성
vi /etc/logstash/conf.d/spring.conf
#파일 안 내용 설정
input {
   tcp {
   port => 4560
   codec => json
   type => logstash
   }
}

output {
	 if [level] in ["WARN", "ERROR"] {
     elasticsearch {
     hosts => "10.0.2.7:9200"
     index => "%{type}-%{+YYYY.MM.DD}"
     }
     stdout {}
   }
}

4560 포트를 통해서 Spring 서버에서 Log를 받아오고,

WARN, ERROR 레벨의 로그만 IP: 10.0.2.7 서버의 ElasticSearch로 로그가 전달된다.

이제 두 Spring 서버의 로그가 한 곳으로 모일 수 있게 되었다.

Spring - Logstash 실행

아래 실행을 통해서, Spring Server에서 들어오는 Log 정보를 확인할 수 있고, ElasticSearch로 잘 전달 되는 지 확인이 가능하다.

sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/spring.conf 

동작 확인

컨트롤러 추가를 통해서, Spring Server에서 WARN이상의 로그만 logstash로 오는 지 확인해보자.

@RestController
@Slf4j
public class PrometheusTestController {

    @GetMapping("/api/info")
    public String info() {
        log.info("info test message");
        return "infoOK";
    }

    @GetMapping("/api/warn")
    public String warn() {
        log.warn("warn test message");
        return "warnOK";
    }

    @GetMapping("/api/error")
    public String error() {
        log.error("error test message");
        return "errorOK";
    }
}

stdout{}을 통해서, Spring Server에서 WARN 이상의 로그만 출력되는 것을 확인할 수 있다.

Elasticsearch 다운, 설정

다운

wget -qO - <https://artifacts.elastic.co/GPG-KEY-elasticsearch> | sudo apt-key add -
echo "deb <https://artifacts.elastic.co/packages/7.x/apt> stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt-get update
apt-get install elasticsearch -y

용량 설정 (본인이 원하는 만큼 설정)

echo '-Xms1G'>> /etc/elasticsearch/jvm.options
echo '-Xmx1G'>> /etc/elasticsearch/jvm.options

정보를 받을 수 있게 설정

vi /etc/elasticsearch/elasticsearch.yml

discovery.send_hosts 를 0.0.0.0으로 설정하여, 모든 곳에서 정보를 받을 수 있도록 설정한다.

cluster.initail_master_nodes 에 우분투 유저 아이디로 설정한다.

실행

systemctl start elasticsearch

Kibana설정

다운

wget -qO - <https://artifacts.elastic.co/GPG-KEY-elasticsearch> | sudo apt-key add -
echo "deb <https://artifacts.elastic.co/packages/7.x/apt> stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt-get update
apt-get install kibana-y

정보를 받을 수 있게 설정

vi /etc/elasticsearch/kibana.yml
server.host: "0.0.0.0"    # "localhost" > "0.0.0.0" 으로 변경

실행

systemctl start kibana

elasticsearch - kibana 정보 확인 검색

127.0.0.7:5601 브라우저에 입력하여 kibana접속 한다.

(LK 서버는 VirtualBox의 NAT 기능을 사용하고 있어서, 고정 아이피는 10.0.2.7을 할당 받고 있고, local에서 접속 하기 위해서, 127.0.0.7로 포트 포워딩을 하였다. 그래서 로컬 브라우저 입력창에 127.0.0.7:5601을 입력해서 접속해야 한다.)

kibana 페이지에서, index pattern들어가서 데이터를 확인할 목록을 찾는다. Name에 logstash-* 라고 입력한다. @timestamp 목록을 선택하고 index pattern을 만든다.

이제 Discover에서 내가 만든 패턴인 logstah-*를 검색해서 시간별, 조건별로 로그를 확인할 수 있다.

회고와 느낀점

우분투 서버에서 ELK 프로그램을 다운 받고 실행하면서, 다양한 실패를 맞이했다. 먼저, Ubuntu의 버전 또는 OS 종류에 따라서, 프로그램 다운 버전과 방법이 크게 다르다는 점을 알았다. 필요한 프로그램을 다운 받을 때는, 버전을 항상 확인해야 겠다.

그리고, 항상 공식 서버의 문서를 잘 읽고, 적용하는 훈련이 필요하다는 것을 느꼈다. 다른 사람들이 작성한 블로그를 참고하는 것은 한계가 있었다.

마지막으로, 개발을 공부하면서 성능이 좋은 노트북이 필수라는 것을 알게 되었다. 각 우분투 서버마다 RAM을 4기가 이상은 주어야 프로그램이 잘 작동했다. RAM을 적게 주고 테스트를 하는데, 시간이 오래 걸려서, 이것 저것 시도하기가 힘들었다.

'리눅스 인프라 > ElasticStack' 카테고리의 다른 글

ELK 개념과 특징  (0) 2023.03.27