๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Spring] Docker๋ฅผ ์ด์šฉํ•œ ElasticSearch, Logstash ์„ค์ •ํ•˜๊ธฐ ๋ณธ๋ฌธ

๐—ฃ๐—ฟ๐—ผ๐—ด๐—ฟ๐—ฎ๐—บ๐—บ๐—ถ๐—ป๐—ด๐Ÿ’ป/๐’๐ฉ๐ซ๐ข๐ง๐ 

[Spring] Docker๋ฅผ ์ด์šฉํ•œ ElasticSearch, Logstash ์„ค์ •ํ•˜๊ธฐ

๐ŸคRyusun๐Ÿค 2025. 3. 30. 16:20

Logback.xml ํŒŒ์ผ์„ ํ™œ์šฉํ•˜์—ฌ Logstash๋ฅผ ์„ค์ •ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ Elasticsearch์— ์ €์žฅํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ์ด๋ฅผ ์œ„ํ•œ ํ•„์š”ํ•œ ์„ค์ • ํŒŒ์ผ๋“ค์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


 

1. Docker Compose ์„ค์ •์— ElasticSearch ๋ฐ Logstash ์ถ”๊ฐ€

docker-compose.yml

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.10.0
    container_name: elasticsearch
    ports:
      - "9200:9200"
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - ES_JAVA_OPTS=-Xms256m -Xmx256m # 256MB๋กœ ์ตœ์†Œ ์„ค์ •, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์žฌ์„ค์ • ํ•„์š”
    networks:
      - elastic-network

  logstash:
    image: docker.elastic.co/logstash/logstash:8.10.0
    container_name: logstash
    ports:
      - "5044:5044"
      - "9600:9600"
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf 
    networks:
      - elastic-network
  1. ElasticSearch ์„ค์ •
    • image: ์‚ฌ์šฉํ•  ElasticSearch Docker ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฒ„์ „ 8.10.0์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • container_name: ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ elasticsearch๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ports: ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ํฌํŠธ ๋งคํ•‘์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 9200 ํฌํŠธ๋Š” ElasticSearch์˜ ๊ธฐ๋ณธ ํฌํŠธ๋กœ, ์™ธ๋ถ€์—์„œ http://localhost:9200์œผ๋กœ ์ ‘์†ํ•˜์—ฌ ElasticSearch๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • environment: ElasticSearch์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์ž…๋‹ˆ๋‹ค.
      • discovery.type=single-node: ๋‹จ์ผ ๋…ธ๋“œ ๋ชจ๋“œ๋กœ ์„ค์ •ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์•„๋‹Œ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      • xpack.security.enabled=false: ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ๊ถŒ์žฅ)
      • ES_JAVA_OPTS=-Xms256m -Xmx256m: ElasticSearch์— ํ• ๋‹นํ•  ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ๊ฐ 256MB๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • networks: elastic-network๋ผ๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  2. Logstash ์„ค์ •
    • image: ์‚ฌ์šฉํ•  Logstash Docker ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ 8.10.0์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • container_name: ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ logstash๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ports: ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ํฌํŠธ ๋งคํ•‘์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • 5044: Logstash์˜ ๊ธฐ๋ณธ ์ž…๋ ฅ ํฌํŠธ๋กœ, ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ์œ„ํ•œ ํฌํŠธ์ž…๋‹ˆ๋‹ค.
      • 9600: Logstash์˜ HTTP API ํฌํŠธ์ž…๋‹ˆ๋‹ค. Logstash ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • volumes: logstash.conf ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ /usr/share/logstash/pipeline/logstash.conf๋กœ ๋งคํ•‘ํ•˜์—ฌ Logstash๊ฐ€ ํ•ด๋‹น ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • networks: elastic-network ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ElasticSearch์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Docker Compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ElasticSearch์™€ Logstash๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. ElasticSearch๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์ด๋ฉฐ, Logstash๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

2. Logstash ์˜์กด์„ฑ ์ถ”๊ฐ€

    //logstash
    implementation 'net.logstash.logback:logstash-logback-encoder:7.4'

 

3. logstash Appender ์ถ”๊ฐ€ (logback.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- MDC ๊ฐ’์ด ์—†์„ ๋•Œ ํ‘œ์‹œํ•  ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • -->
    <property name="DEFAULT_MDC" value="-"/>

    <!-- MDC ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •์„ ์œ„ํ•œ ์ดˆ๊ธฐํ™” -->
    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>

    <!-- MDC ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ TurboFilter -->
    <turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter"/>

    <!-- ๊ณตํ†ต ๋กœ๊ทธ ํŒจํ„ด ์ •์˜ -->
    <property name="COMMON_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%.-5level] [%X{request_id:-}] [%X{layer:-}] [%X{api:-}] [%X{error_source:-}] %logger - %msg%n"/>

    <!-- ๋กœ๊ทธ๋ฅผ ์–ด๋””์— ์ถœ๋ ฅํ• ์ง€ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„. ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ appender๋ฅผ ์„ค์ •ํ•œ๋‹ค. -->

    <!-- Logstash๋กœ ์ „์†กํ•  Appender -->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>localhost:5044</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <!--Console: ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ํŒจํ„ด์„ ์ •์˜ํ•˜๊ณ , utf8 ๋ฌธ์ž์…‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${COMMON_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- Root ๋ ˆ๋ฒจ ์„ค์ • -->
    <!-- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ ˆ๋ฒจ์€ INFO๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, Console appender๊ฐ€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.-->
    <root level="INFO">
        <appender-ref ref="Console" />
    </root>

    <!-- Controller ๋ ˆ๋ฒจ ๋กœ๊น… ์„ค์ • -->
    <logger name="com.iruyeon.v1.domain.client.controller" level="INFO" additivity="false">
        <appender-ref ref="Console" />
    </logger>

    <!-- Service ๋ ˆ๋ฒจ ๋กœ๊น… ์„ค์ • -->
    <logger name="com.iruyeon.v1.domain.client.service" level="INFO" additivity="false">
        <appender-ref ref="Console" />
    </logger>

    <!-- Repository ๋ ˆ๋ฒจ ๋กœ๊น… ์„ค์ • -->
    <logger name="com.iruyeon.v1.domain.client.repository" level="INFO" additivity="false">
        <appender-ref ref="Console" />
    </logger>

    <!-- ๋กœ์ปฌ ํ™˜๊ฒฝ ์„ค์ • -->
    <!-- ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ INFO๋กœ ์„ค์ •ํ•˜๊ณ , Console, LOGSTASH(ํ…Œ์ŠคํŠธ์šฉ) ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.-->
    <springProfile name="local">
        <root level="INFO">
            <appender-ref ref="Console"/>
            <appender-ref ref="LOGSTASH" /> 
        </root>
    </springProfile>

    <!-- ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์„ค์ • -->
    <!-- ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ERROR๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค -->
    <springProfile name="dev,prod">
        <root level="ERROR">
            <appender-ref ref="Console"/>
            <appender-ref ref="LOGSTASH" />
        </root>
    </springProfile>

</configuration>

 

4. logstash ์‹คํ–‰ ์„ค์ • ํŒŒ์ผ (logstash.conf)

logstash.conf ์„ค์ •ํŒŒ์ผ์„ docker-compose.yml ํŒŒ์ผ๊ณผ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

input {
    tcp {
        port => 5044
        codec => json
    }
}

output {
    elasticsearch {
        hosts => ["http://elasticsearch:9200"]
        index => "application-logs-%{+YYYY.MM.dd}"
    }
}

 

5. docker-compose ํŒŒ์ผ ์‹คํ–‰

docker-compose -f docker-compose.yml up -d

 

6. Elasticsearch์—์„œ๋Š” API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Elasticsearch ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ๋ชจ๋“  ์ธ๋ฑ์Šค์˜ ์ •๋ณด ํ™•์ธ

Elasticsearch์—์„œ๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋ชจ๋“  ์ธ๋ฑ์Šค์˜ ์ธ๋ฑ์Šค ์ด๋ฆ„, ์ƒํƒœ, ์ƒค๋“œ ์ˆ˜, ๋ฌธ์„œ ์ˆ˜ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

GET http://localhost:9200/_cat/indices

 

  • yellow
    • ์ธ๋ฑ์Šค์˜ ์ƒํƒœ
    • 'yellow'๋Š” ๋ชจ๋“  ์ƒค๋“œ๊ฐ€ ๋ณต์ œ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ธ๋ฑ์Šค์˜ ์ฃผ ์ƒค๋“œ๋Š” ์žˆ์ง€๋งŒ ๋ณต์ œ๋ณธ ์ƒค๋“œ๊ฐ€ ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
    • 'green'์€ ๋ชจ๋“  ์ƒค๋“œ๊ฐ€ ๋ณต์ œ๋ณธ๊ณผ ํ•จ๊ป˜ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์ƒํƒœ์ด๊ณ , 'red'๋Š” ์ผ๋ถ€ ์ƒค๋“œ๊ฐ€ ์†์ƒ๋˜์—ˆ๊ฑฐ๋‚˜ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • open
    • ์ธ๋ฑ์Šค๊ฐ€ ์—ด๋ฆฐ ์ƒํƒœ
    • 'open'์€ ์ธ๋ฑ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์—ด๋ ค ์žˆ์–ด ๊ฒ€์ƒ‰์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
    • 'closed'๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋‹ซํ˜€ ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • application-logs-2025.03.30
    • ์ธ๋ฑ์Šค์˜ ์ด๋ฆ„
    • 'application-logs-2025.03.30'์ด๋ผ๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์ด๋ฆ„์€ ๋ณดํ†ต ๋‚ ์งœ๋‚˜ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ช…๋ช…๋˜๋ฉฐ, ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • zgmHCZS5RB6FLLcStFngSg
    • ์ธ๋ฑ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” Elasticsearch ๋…ธ๋“œ์˜ ID
    • ์ด ๊ฐ’์€ ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ์–ด๋А ๋…ธ๋“œ์— ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • 1
    • ์ธ๋ฑ์Šค์˜ primary ์ƒค๋“œ ์ˆ˜
    • ์—ฌ๊ธฐ์„œ๋Š” 1๊ฐœ์˜ primary ์ƒค๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Elasticsearch๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐํ•˜์—ฌ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ƒค๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ƒค๋“œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
  • 1
    • ์ธ๋ฑ์Šค์˜ ๋ณต์ œ ์ƒค๋“œ ์ˆ˜
    • ์—ฌ๊ธฐ์„œ๋Š” 1๊ฐœ์˜ ๋ณต์ œ๋ณธ ์ƒค๋“œ๊ฐ€ ์„ค์ •๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ ์ƒค๋“œ๋Š” ์ฃผ ์ƒค๋“œ์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ, ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • 74
    • ์ธ๋ฑ์Šค์— ์ €์žฅ๋œ ๋ฌธ์„œ์˜ ์ˆ˜
    • ์—ฌ๊ธฐ์„œ๋Š” 74๊ฐœ์˜ ๋ฌธ์„œ๊ฐ€ ์ธ๋ฑ์Šค์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • 0
    • ์‚ญ์ œ๋œ ๋ฌธ์„œ์˜ ์ˆ˜
    • ํ˜„์žฌ ์‚ญ์ œ๋œ ๋ฌธ์„œ๋Š” ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • 280.8kb
    • ์ธ๋ฑ์Šค์˜ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ
    • '280.8kb'๋Š” ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋””์Šคํฌ ๊ณต๊ฐ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค์˜ ํฌ๊ธฐ๋Š” ๋ฌธ์„œ์˜ ์ˆ˜์™€ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 280.8kb
    • ์ธ๋ฑ์Šค์˜ ์ด ํฌ๊ธฐ
    • ์ด ๊ฐ’์€ ๋ฐ์ดํ„ฐ์™€ ๋ณต์ œ๋ณธ์„ ํฌํ•จํ•œ ์ „์ฒด ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์™€ ๋ณต์ œ๋ณธ์ด ๋™์ผํ•œ ํฌ๊ธฐ๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ์ƒํƒœ์ž„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

 

7. ํŠน์ • ์ธ๋ฑ์Šค ๋กœ๊ทธ ํ™•์ธํ•˜๊ธฐ

http://localhost:9200/{์ธ๋ฑ์Šค ์ด๋ฆ„}/_search

 

application-logs-2025.03.30 ์ธ๋ฑ์Šค์—์„œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” JSON ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

 

 

Elasticsearch ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ

{
    "took": 48,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 111,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "application-logs-2025.03.30",
                "_id": "cB3D5ZUBP2QWHruMGD6R",
                "_score": 1.0,
                "_source": {
                    "logger_name": "org.apache.catalina.core.StandardService",
                    "thread_name": "main",
                    "message": "Starting service [Tomcat]",
                    "level_value": 20000,
                    "level": "INFO",
                    "@timestamp": "2025-03-30T06:35:23.024462Z",
                    "@version": "1"
                }
            },
            {
                "_index": "application-logs-2025.03.30",
                "_id": "ch3D5ZUBP2QWHruMGD68",
                "_score": 1.0,
                "_source": {
                    "logger_name": "org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]",
                    "thread_name": "main",
                    "message": "Initializing Spring embedded WebApplicationContext",
                    "level_value": 20000,
                    "level": "INFO",
                    "@timestamp": "2025-03-30T06:35:23.078337Z",
                    "@version": "1"
                }
            },
            {
                "_index": "application-logs-2025.03.30",
                "_id": "cx3D5ZUBP2QWHruMGD7A",
                "_score": 1.0,
                "_source": {
                    "logger_name": "org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext",
                    "thread_name": "main",
                    "message": "Root WebApplicationContext: initialization completed in 1935 ms",
                    "level_value": 20000,
                    "level": "INFO",
                    "@timestamp": "2025-03-30T06:35:23.079794Z",
                    "@version": "1"
                }
            },
            {
                "_index": "application-logs-2025.03.30",
                "_id": "dB3D5ZUBP2QWHruMGT4H",
                "_score": 1.0,
                "_source": {
                    "logger_name": "com.zaxxer.hikari.HikariDataSource",
                    "api": "-",
                    "message": "HikariPool-1 - Starting...",
                    "level_value": 20000,
                    "level": "INFO",
                    "layer": "-",
                    "request_id": "-",
                    "@timestamp": "2025-03-30T06:35:23.158256Z",
                    "thread_name": "main",
                    "error_source": "-",
                    "@version": "1"
                }
            },
            {
                "_index": "application-logs-2025.03.30",
                "_id": "dh3D5ZUBP2QWHruMGT7P",
                "_score": 1.0,
                "_source": {
                    "logger_name": "org.hibernate.jpa.internal.util.LogHelper",
                    "api": "-",
                    "message": "HHH000204: Processing PersistenceUnitInfo [name: default]",
                    "level_value": 20000,
                    "level": "INFO",
                    "layer": "-",
                    "request_id": "-",
                    "@timestamp": "2025-03-30T06:35:23.357045Z",
                    "thread_name": "main",
                    "error_source": "-",
                    "@version": "1"
                }
            },
            {
                "_index": "application-logs-2025.03.30",
                "_id": "dx3D5ZUBP2QWHruMGT75",
                "_score": 1.0,
                "_source": {
                    "logger_name": "org.hibernate.cache.internal.RegionFactoryInitiator",
                    "api": "-",
                    "message": "HHH000026: Second-level cache disabled",
                    "level_value": 20000,
                    "level": "INFO",
                    "layer": "-",
                    "request_id": "-",
                    "@timestamp": "2025-03-30T06:35:23.395322Z",
                    "thread_name": "main",
                    "error_source": "-",
                    "@version": "1"
                }
            },
            {
                "_index": "application-logs-2025.03.30",
                "_id": "eR3D5ZUBP2QWHruMGT75",
                "_score": 1.0,
                "_source": {
                    "logger_name": "org.hibernate.Version",
                    "api": "-",
                    "message": "HHH000412: Hibernate ORM core version 6.6.8.Final",
                    "level_value": 20000,
                    "level": "INFO",
                    "layer": "-",
                    "request_id": "-",
                    "@timestamp": "2025-03-30T06:35:23.379738Z",
                    "thread_name": "main",
                    "error_source": "-",
                    "@version": "1"
                }
            },
            {
                "_index": "application-logs-2025.03.30",
                "_id": "eh3D5ZUBP2QWHruMGj6h",
                "_score": 1.0,
                "_source": {
                    "logger_name": "org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo",
                    "api": "-",
                    "message": "No LoadTimeWeaver setup: ignoring JPA class transformer",
                    "level_value": 20000,
                    "level": "INFO",
                    "layer": "-",
                    "request_id": "-",
                    "@timestamp": "2025-03-30T06:35:23.569839Z",
                    "thread_name": "main",
                    "error_source": "-",
                    "@version": "1"
                }
            },
            {
                "_index": "application-logs-2025.03.30",
                "_id": "ex3D5ZUBP2QWHruMGj7j",
                "_score": 1.0,
                "_source": {
                    "logger_name": "org.hibernate.orm.deprecation",
                    "api": "-",
                    "message": "HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)",
                    "level_value": 30000,
                    "level": "WARN",
                    "layer": "-",
                    "request_id": "-",
                    "@timestamp": "2025-03-30T06:35:23.625212Z",
                    "thread_name": "main",
                    "error_source": "-",
                    "@version": "1"
                }
            },
            {
                "_index": "application-logs-2025.03.30",
                "_id": "fB3D5ZUBP2QWHruMGj7q",
                "_score": 1.0,
                "_ignored": [
                    "message.keyword"
                ],
                "_source": {
                    "logger_name": "org.hibernate.orm.connections.pooling",
                    "api": "-",
                    "message": "HHH10001005: Database info:\n\tDatabase JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)']\n\tDatabase driver: undefined/unknown\n\tDatabase version: 8.1\n\tAutocommit mode: undefined/unknown\n\tIsolation level: undefined/unknown\n\tMinimum pool size: undefined/unknown\n\tMaximum pool size: undefined/unknown",
                    "level_value": 20000,
                    "level": "INFO",
                    "layer": "-",
                    "request_id": "-",
                    "@timestamp": "2025-03-30T06:35:23.638567Z",
                    "thread_name": "main",
                    "error_source": "-",
                    "@version": "1"
                }
            }
        ]
    }
}

 

1. ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„

  • took: 48ms
  • Elasticsearch ์ฟผ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌ๋œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ์‹คํ–‰์ด 48๋ฐ€๋ฆฌ์ดˆ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

2. ํƒ€์ž„์•„์›ƒ ์—ฌ๋ถ€

  • timed_out: false
  • ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰ ์ค‘ ํƒ€์ž„์•„์›ƒ๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

3. ์ƒค๋“œ ์ƒํƒœ

  • _shards:
    • total: 1 (์ด ์ƒค๋“œ ์ˆ˜)
    • successful: 1 (์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋œ ์ƒค๋“œ ์ˆ˜)
    • failed: 0 (์‹คํŒจํ•œ ์ƒค๋“œ ์ˆ˜)
  • ์ฟผ๋ฆฌ๊ฐ€ ํ•˜๋‚˜์˜ ์ƒค๋“œ์—์„œ ์‹คํ–‰๋˜์—ˆ๊ณ  ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

4. ๊ฒ€์ƒ‰๋œ ๋กœ๊ทธ ์ˆ˜

  • hits.total.value: 111
  • ์ด 111๊ฐœ์˜ ๋กœ๊ทธ ํ•ญ๋ชฉ์ด ๊ฒ€์ƒ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

5. ๋กœ๊ทธ ํ•ญ๋ชฉ ์˜ˆ์‹œ

  • _index: application-logs-2025.03.30 (ํ•ด๋‹น ๋กœ๊ทธ๊ฐ€ ์ €์žฅ๋œ ์ธ๋ฑ์Šค)
  • _id: ๊ฐ ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ๊ณ ์œ  ID (์˜ˆ: cB3D5ZUBP2QWHruMGD6R)
  • _score: ํ•ด๋‹น ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ๊ด€๋ จ๋„ ์ ์ˆ˜ (1.0)
  • _source: ๋กœ๊ทธ ํ•ญ๋ชฉ์˜ ์‹ค์ œ ๋‚ด์šฉ:
    • logger_name: ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•œ ํด๋ž˜์Šค๋‚˜ ํŒจํ‚ค์ง€ ์ด๋ฆ„ (์˜ˆ: org.apache.catalina.core.StandardService)
    • message: ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ (์˜ˆ: Starting service [Tomcat])
    • level: ๋กœ๊ทธ์˜ ๋ ˆ๋ฒจ (์˜ˆ: INFO, WARN)
    • @timestamp: ๋กœ๊ทธ ๋ฐœ์ƒ ์‹œ๊ฐ„ (์˜ˆ: 2025-03-30T06:35:23.024462Z)

 


 

ElasticSearch head ๋กœ ๋กœ๊ทธ ํ™•์ธํ•˜๊ธฐ

Chrome ๋ธŒ๋ผ์šฐ์ €์—์„œ Elasticsearch Head ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด Elasticsearch ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

๋งŒ์•ฝ Elasticsearch๊ฐ€ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ํŠน์ • ์„œ๋ฒ„ IP ์ฃผ์†Œ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด, Elasticsearch Head์˜ ์™ผ์ชฝ ์ƒ๋‹จ์— ์žˆ๋Š” New ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ƒˆ๋กœ์šด ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด, ํ•ด๋‹น ์„œ๋ฒ„์˜ Elasticsearch ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ธ๋ฑ์Šค ๋ชฉ๋ก (Browser) 

  • Elasticsearch ํด๋Ÿฌ์Šคํ„ฐ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์›น ๊ธฐ๋ฐ˜์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค
  • ์ธ๋ฑ์Šค ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์ธ๋ฑ์Šค์˜ ์ƒํƒœ, ๋ฌธ์„œ ์ˆ˜, ํฌ๊ธฐ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ธ๋ฑ์Šค์˜ ๋งคํ•‘(mapping) ๋ฐ ์„ค์ •(settings)์„ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฟผ๋ฆฌ ์‹คํ–‰ (Query Execution)

  • REST API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Elasticsearch์˜ ์ฟผ๋ฆฌ DSL์„ ์‚ฌ์šฉํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์ธ GET, POST, PUT, DELETE ์š”์ฒญ์„ ์ง€์›ํ•˜์—ฌ, ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

[์ฐธ๊ณ ]

https://inf.run/qfoUB

 

๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•„์š”ํ•œ ๋กœ๊ทธ ๊ด€๋ฆฌ ๊ฐ•์˜ | ์ด์ค€ํ˜•(Foo) - ์ธํ”„๋Ÿฐ

์ด์ค€ํ˜•(Foo) | , ์•„์ง๋„ SSH๋กœ ์„œ๋ฒ„์— ์ ‘์†ํ•ด์„œ ๋กœ๊ทธ๋ฅผ ๋ณด์‹œ๋‚˜์š”?์„œ๋ฒ„์— ์ง์ ‘ ๋กœ๊ทธ์ธํ•˜์—ฌ ๋กœ๊ทธ ํŒŒ์ผ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•  ๊ฒฝ์šฐ ๊ฐ

www.inflearn.com