컨테이너 환경 로그 수집해보기

2024. 12. 4. 22:13·Ops

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
'Ops' 카테고리의 다른 글
  • Jenkins로 ci/cd 파이프라인 구축하기(1)
  • k8s 환경에 내 서비스 띄워보기
  • kind 이용해서 k8s 다뤄보기
  • Github Action을 이용한 CI/CD 파이프라인 구축
khjoon
khjoon
  • khjoon
    기록기록
    khjoon
  • 전체
    오늘
    어제
    • 분류 전체보기 (37)
      • Security (2)
      • Dev (14)
      • Infra (12)
      • Ops (9)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
khjoon
컨테이너 환경 로그 수집해보기
상단으로

티스토리툴바