ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SpringBoot 프로젝트 ELK 연동
    개발 지식 2024. 11. 9. 16:23

    ElasticSearch: 검색 엔진, 로그 저장소
    LogStash: SpringBoot의 Logback에 저장된 로그를 ElasticSearch로 전송
    Kibana: ElasticSearch에 저장된 로그를 시각화

     

    테스트 편의성을 위해 세가지 스택을 Docker-Compose를 통해 실행

    networks:  
      elk:  
        driver: bridge  
    
    services:  
      # Elastic search 설정  
      elasticsearch:  
        container_name: elasticsearch  
        image: docker.elastic.co/elasticsearch/elasticsearch:8.15.3  
        ports:  
          - 9200:9200  
          - 9300:9300  
        # Elastic search 계정정보  
        environment:  
          discovery.type: single-node  
          xpack.security.enabled: false  
          xpack.security.transport.ssl.enabled: false  
        networks:  
          - elk  
    
      # Logstash 설정  
      logstash:  
        container_name: logstash  
        image: logstash:8.15.3  
        ports:  
          - 5000:5000  
          - 9600:9600  
        volumes:  
          - ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf  
        depends_on:  
          - elasticsearch  
        networks:  
          - elk  
    
      # Kibana 설정  
      kibana:  
        container_name: kibana  
        image: kibana:8.15.3  
        ports:  
          - 5601:5601  
        depends_on:  
          - elasticsearch  
        volumes:  
          - ./kibana/logstash.conf/kibana.yml:/usr/share/kibana/logstash.conf/kibana.yml  
        networks:  
          - elk

     

    보안이 불필요 했기에 xpack.security를 모두 false 설정 했다.
    xpack.security가 모두 true라면 계정 정보와 SSL 인증을 애플리케이션 계층에서 거쳐야 ElasticSearch 연동에 성공한다.

     

    kibana 설정 파일

    server.name: kibana  
    server.host: "0"  
    
    elasticsearch.hosts: http://elasticsearch:9200  
    elasticsearch.username: "elastic"  
    elasticsearch.password: "elastic123!@#"

     

     

    (xpack.security를 false로 했기에 username, password는 불필요)

     

    logback.yml 파일
    SpringBoot의 logback에 저장된 로그를 LogStash를 통해 수집, 변환 및 전송하는 파이프라인을 정의한다.
    output에서 정의한 인덱스를 기준으로 kibana에서 로그를 모니터링 하게 된다.

    input {  
      tcp {  
        port => 5000  
        codec => json_lines  
      }  
    }  
    
    output {  
      elasticsearch {  
        hosts => "elasticsearch:9200"  
        user => "elastic"  
        password => "elastic123!@#"  
        index => "logstash-%{+YYYY.MM.dd}"  
      }  
    }

     

    파일 구조는 다음과 같으며 elk라는 최상위 폴더 안에 생성했다.

    compose.yml 
    logstash 
    -pipeline 
    --logstash.conf 
    kibana 
    -config 
    --kibana.yml

     

    elk 디렉토리에서 docker compose up 명령어(백그라운드 실행은 -d 추가)를 사용하여 elk 스택을 모두 실행할 수 있다.

     

    SpringBoot의 logback에 저장되는 로그와 LogStash가 이해할 수 있는 로그는 형식이 다르다.
    LogStash가 이해할 수 있도록 로그를 인코딩하기 위해 다음과 같은 과정이 필요하다.

     

    프로젝트에 의존성을 추가한다.
    implementation 'net.logstash.logback:logstash-logback-encoder:7.4'

     

    resouces 디렉토리에 logback.xml 파일을 생성한다.

    <?xml version="1.0" encoding="UTF-8"?>  
    <configuration>  
      <include resource="org/springframework/boot/logging/logback/base.xml"/>  
    
      <!-- Logstash appender 설정 -->  
      <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">  
        <destination>localhost:5000</destination>  
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>  
      </appender>  
      <!-- root 로거 설정 -->  
      <root level="INFO">  
        <appender-ref ref="LOGSTASH"/>  
      </root>  
      <!-- 특정 패키지나 클래스에 대한 로거 설정 (필요할 경우 추가) -->  
      <logger name="INFO_LOG" level="DEBUG" additivity="false">  
        <appender-ref ref="LOGSTASH"/>  
      </logger>  
    </configuration>

     

    http://localhost:5601 를 통해 Kibana에 접속할 수 있다.

     

    애플리케이션을 실행하고 로그가 발생하면, 화면 좌측 Discover에서 인덱스를 만들라는 화면이 출력된다.
    인덱스를 만들면 로그를 실시간 모니터링 할 수 있다.

     

    '개발 지식' 카테고리의 다른 글

    ElasticsearchException + MappingException  (0) 2025.01.24
    프로젝트 분석 도구  (4) 2024.11.09
    코딩 컨벤션 (Coding Conventions)  (0) 2023.12.26
Designed by Tistory.