Intro
docker compose에 대해서 배우면서 도커 볼륨을 이용해서 서버로 이용하는 컨테이너와 로그수집기, 메트릭 수집기간에 볼륨을 공유하여 볼륨 안에 데이터를 저장할 수 있다는 방법을 듣고 구현해보았습니다.
docker compose를 사용한 이유
여러 컨테이너를 한개의 yaml 파일로 관리할 수 있고 버전 관리가 용이합니다. 도커 네트워크와 볼륨을 관리하기 용이합니다.
Tool
docker-compose
ELK stack
docker compose yaml 파일 작성해서 ELK 파이프라인 구축하기
elasticsearch, logstash, kibana를 docker compose를 이용해서 구축했습니다.
로그를 표준출력으로 logstash로 내보내서 elasticsearch에 저장되도록 구현했습니다.
ELK는 Spring boot와 호환되는 버전을 사용했습니다.
logstash는 logstash.conf를 설정해줘야해서 local에 있는 디렉토리와 마운트 해줬습니다.
서버에서 ELK를 사용할 때는logstash.conf, elasticsearch.yml, kibana.yml는 서버에 설정파일을 작성한 뒤 마운트 해주면 됩니다.
서버에 올려서 사용할 때는 localhost를 서버 ip로 바꿔서 사용하면 됩니다.
//docker-compose.yml
services:
elasticsearch:
image: elasticsearch:7.17.3
container_name: elasticsearch
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- private
logstash:
image: logstash:7.17.3
container_name: logstash
ports:
- "5001:5001"
- "9600:9600"
depends_on:
- elasticsearch
networks:
- private
volumes:
- /Users/hyoungjoon/logstash/pipeline:/usr/share/logstash/pipeline
kibana:
image: kibana:7.17.3
container_name: kibana
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- private
networks:
private:
name: "private"
logstash.conf 작성하기
spring boot 서버로부터 받은 로그를 logstash로 받고 elasticsearch로 저장해줍니다.
//logstash.conf
input{
tcp{
port => 5001
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "spring-logs-%{+YYYY.MM.dd}"
}
}
//docker compose 실행
$ docker compose up -d
// logstash로 데이터를 보냈을 때 elastic search에 잘 담기는것을 확인할 수 있습니다.
echo "This is a test log message" | nc localhost 5001
localhost:5601로 접속한 뒤 alytics -> discover에 가서 인덱스를 생성하라는 창으로 바뀌고 인덱스를 생성한 뒤 discover에 다시 들어오면 잘 저장되는 것을 확인할 수 있습니다.
spring 서버에서 로그 날려보기
로그를 남기기 위해서 spring에서 설정
xml 파일을 이용해서 로그를 더 세세하게 커스텀할 수 있다고 해서 xml 파일을 작성했습니다.
logback을 사용하기 위해 라이브러리 추가
implementation 'net.logstash.logback:logstash-logback-encoder:7.2'
로그가destination에 logstash 주소를 적으면 세팅해둔 로그 스태시로 전달되게 됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- 로그 패턴에 색상 적용 %clr(pattern){color} -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<property name="CONSOLE_LOG_PATTERN"
value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %clr(%-5level) %clr(${PID:-}){magenta} %clr(---){faint}
%clr([%15.15thread]){faint} %clr(%-40.40logger{36}){cyan} %clr(:){faint} %msg%n"/>
<!-- 콘솔(STDOUT) -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!--logstash -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5001</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="LOGSTASH" />
</root>
</configuration>
spring boot 서버를 동작하니 로그가 elastic search에 잘 저장되는 것을 확인할 수 있습니다.
'Ops' 카테고리의 다른 글
Jenkins로 ci/cd 파이프라인 구축하기(2) (0) | 2024.12.04 |
---|---|
Jenkins로 ci/cd 파이프라인 구축하기(1) (0) | 2024.12.04 |
k8s 환경에 내 서비스 띄워보기 (0) | 2024.12.04 |
kind 이용해서 k8s 다뤄보기 (0) | 2024.12.04 |
Github Action을 이용한 CI/CD 파이프라인 구축 (0) | 2024.12.04 |