본문 바로가기

Docker 시작하기 - RestAPI편

3) Spring Boot Rest API Docker log 보기

반응형

docker 상태에서 로그 확인을 하기 위해 2가지 방법을 테스트 해봤다.

 

1) docker run시에 -v 옵션으로 logback 에 설정한 file appender의 설정에 따른 설정 파일을 외부 volumn에 마운트하여 모아서 보는 방법

- 장점 : 다른 package의 설치나 설정없이 docker run 옵션을 추가하는것만으로 해결가능함.

- 단점 : 새로운 docker 를 run 할때 마다 volumn 옵션이나 run 옵션을 수정할 필요가 생김.

 

2) ELK 를 사용하여 docker 로그를모아서 보는 방법.

- 장점 : kibana 로 로그를 UI를 통해 쉽게 분석 가능함.

- 단점 : ELK에 대한 러닝커브가 생기고  ELK에 대한 설정과 spring boot에 logback에 logstash 설정을 따로해줘야함.

 

각가 장단점이 있지만 장기적으로 봤을때 관리의 용이성과 springboot 뿐만 아니라 ngnix나 다른 application들의 log도 통합해서 볼 수 있는 ELK를 사용해 적용해 보자.

 

먼저 기존 spring boot application에 logback.xml를 아래와 같이 logstash 설정을 추가한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<springProfile name="local">	
	    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
	        <layout class="ch.qos.logback.classic.PatternLayout">
	            <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
	        </layout>
	    </appender>
	   	<appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
	        <destination>localhost:5000</destination>
	       	<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
	    </appender>
	    <root level="debug">
	    	<appender-ref ref="STASH" />
	        <appender-ref ref="STDOUT" />
	    </root>
    </springProfile>
    <springProfile name="dev">	   
	    <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
	        <destination>localhost:5000</destination>
	       	<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
	    </appender>
   
	    <root level="debug">
	    	<appender-ref ref="STASH" />
	        
	    </root>
    </springProfile>
</configuration>

위와 같이 logstash를 설정을 추가 하기 위해 build.gradle에 logstash를 추가하자.

plugins {
	id 'org.springframework.boot' version '2.4.0'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
}

group = 'com.devracoon'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
compileJava.options.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}
repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'io.jsonwebtoken:jjwt:0.9.1'
	implementation 'net.logstash.logback:logstash-logback-encoder:5.0'
	compile 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	
}

test {
	useJUnitPlatform()
}

 

이제 spring application에 대한 설정은 끝. 

ELK 설치를 해보자 . 

 

1) docker elk를 다운로드 한다.

git clone https://github.com/ksundong/docker-elk-kor.git

2) docker-elk/logstash/pipline/logstash.conf 파일수정 

 

input {
        beats {
                port => 5044
        }

        tcp {
                port => 5000
                codec => json_lines
        }
}

## Add your filters / logstash plugins configuration here

output {
        elasticsearch {
                hosts => "localhost:9200"
                user => "elastic"
                password => "changeme"
                ecs_compatibility => disabled
                index => "springboot-logger-%{+YYYY.MM.dd}"
        }
}

3) docker-elk/logstash/config/logstash.yml

## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
#
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://localhost:9200" ]

## X-Pack security credentials
#
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme

4) docker-elk/docker-elk/kibana/config/kibana.yml

 

## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts
#
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://localhost:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

## X-Pack security credentials
#
elasticsearch.username: elastic
elasticsearch.password: changeme

 

위와 같이 설정 파일들의 ip 부분을 다 변경했다. 이제 docker-compose를 설치하고 실행해 보자.

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 버전 확인
docker-compose -v

 

 

위와 같이 docker-compose를 설치하고 권한으 변경하고 link 작업을 해줬다.

 

이제 다운받은 docker-elk 폴더로 들어가서 docker-compose bulid를 실행해보자

docker-compose build

docker-compose up -d

그러면 docker ps -a 를 해서 container가 잘 실행 되었는지 확인해 보자. 

 

 

정상적으로 els, kibana , logstash가 실행되었다.

이제 post man을 통해서 api를 호출해 보고 호출한 api의 로그가 정상적으로 조회 되는지 kibana로 확인해 보자.

 

kibana 를 통해 접속해 보자. 초기 아이디 비번은 위에 kibana config 파일에 나와 있다.

kibana 접속해서 왼쪽 메뉴에서 Manaement > Stack Management 를 선택

 

 

 

kibana > Index Patterns 을 선택해 pattern을 만든다.

 

 

Create Index Pattern을 클릭.

화면에서 아래에 수집된 데이터 패턴 3가지가 있다고 표시해 주고 있다.

index pattern name에 아래 source에서 보고 싶은 source의 pattern를 만든다고 생각하면 된다.

 

그리고 왼쪽 메뉴에서 

 

 

Kibana > Discover 를 선택하면 

 

 

그림 처럼 springboot로 들어오는 source에 대한 log가 나오는것을 확인 할 수 있다.

 

elk에 대한 로그 확인이 완료.