Skip to content

lyjh98/ELK-Project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

33 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿฆพ ELK-Project

๐Ÿ“ ์†Œ๊ฐœ


โœ… ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” Spring Boot์—์„œ ๋กœ๊ทธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , JMeter๋กœ ๋ถ€ํ•˜ ํŠธ๋ž˜ํ”ฝ์„ ์ƒ์„ฑํ•œ ํ›„, Filebeat โ†’ Logstash โ†’ Elasticsearch โ†’ Kibana๋กœ ์ด์–ด์ง€๋Š” ์—”๋“œ-ํˆฌ-์—”๋“œ ๋กœ๊ทธ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•œ ์‹ค์Šตํ˜• ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

โœ… JSON ๊ธฐ๋ฐ˜ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ๊ตญ๊ฐ€๋ณ„, ์‹œ๊ฐ„๋Œ€๋ณ„ ๊ณต๊ฒฉ ์ถ”์ด ๋ถ„์„๊นŒ์ง€ ์ง์ ‘ ์‹œ๊ฐํ™”ํ•˜๋ฉฐ, ์šด์˜ํ™˜๊ฒฝ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ฒฝํ—˜๋„ ํ•จ๊ป˜ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.


๊ฐ•ํ•œ์†” ์ด์ œํ˜„ ์ „์ˆ˜๋ฏผ ํ™ฉ๋ณ‘๊ธธ
kkangsol lyjh98 Jsumin07 Gill010147

๐ŸŽฌ ๋ฉ”์ธ ์‹œ๋‚˜๋ฆฌ์˜ค


๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ


- โœ… ๋กœ๊ทธ ๋ถ„์„ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์˜ ์ „ ๊ณผ์ •์„ ์‹ค๋ฌด ํ๋ฆ„๋Œ€๋กœ ๊ตฌํ˜„

- โœ… JMeter ๊ธฐ๋ฐ˜์˜ ๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค ์ƒ์„ฑ โ†’ ๊ตฌ์กฐํ™”๋œ JSON ๋กœ๊ทธ ์ˆ˜์ง‘

- โœ… Filebeat โ†’ Logstash โ†’ Elasticsearch โ†’ Kibana๋กœ ์ด์–ด์ง€๋Š” ์ˆ˜์ง‘/์ƒ‰์ธ/์‹œ๊ฐํ™” ํŒŒ์ดํ”„๋ผ์ธ ๊ฒ€์ฆ

- โœ… ๊ณต๊ฒฉ ํŒจํ„ด, ์‹œ๊ฐ„๋Œ€, ๊ตญ๊ฐ€๋ณ„ ์ด์ƒ ๋กœ๊ทธ ๋ถ„ํฌ ์‹œ๊ฐํ™”๋กœ ์ธ์‚ฌ์ดํŠธ ๋„์ถœ


๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

Filebeat Logstash Elasticsearch Kibana Spring Boot JMeter Eclipse ChatGPT Lombok

๐Ÿ“‹ ์ฃผ์š” ๊ธฐ์ˆ  ๋ฐ ๋ฒ„์ „

๋ชฉ์  ๊ธฐ๋Šฅ ๋ฒ„์ „
๐Ÿ” ๋กœ๊ทธ ์ˆ˜์ง‘ Filebeat 7.11.2
โšก ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต Logstash 7.11.2
๐Ÿ’พ ์ €์žฅ/๊ฒ€์ƒ‰ Elasticsearch 7.11.2
๐Ÿ“Š ์‹œ๊ฐํ™” Kibana 7.11.2
๐ŸŒ API/๋ฐ์ดํ„ฐ Spring Boot 3.5.3
๐Ÿš€ ๋ถ€ํ•˜์ƒ์„ฑ JMeter 5.6.3

โš™๏ธ ํ”„๋กœ์ ํŠธ ๋‚ด์šฉ

๐Ÿ“Œ Pipe Line

image

๐Ÿ“Œ Spring Boot

์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์š”์ฒญ ์ˆ˜์‹  ํ›„ DTO ๊ธฐ๋ฐ˜ ๋กœ๊ทธ ์ƒ์„ฑ
package com.example.loginlog.dto;

import lombok.Data;

@Data	//	Getter, Setter, toString ๋“ฑ ํ•„์š”ํ•œ lombok์ƒ์„ฑ
public class LoginRequest {
	
    private String email = "ian.lee@celebritymail.com";	// ์ด๋ฉ”์ผ ๊ณ ์ •
    private String password;	//ํŒจ์Šค์›Œ๋“œ	
    private String country;		//์ ‘์† ์‹œ๋„ ๋‚˜๋ผ
    private String timestamp;		//์ ‘์† ์‹œ๋„ ์‹œ๊ฐ„
    private boolean success;	//์„ฑ๊ณต ์‹คํŒจ
    private String failureReason;	//์‹คํŒจ ์ด์œ 

}
์„ฑ๊ณต/์‹คํŒจ ์‹œ ๋กœ๊ทธ ํ˜•ํƒœ ๊ตฌ๋ถ„ํ•˜์—ฌ JSON ๋กœ๊ทธ ๊ธฐ๋ก
package com.example.loginlog.controller;

import org.springframework.web.bind.annotation.RestController;

import com.example.loginlog.dto.LoginRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;

@RestController	// ์ด ํด๋ž˜์Šค๊ฐ€ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ž„์„ ๋ช…์‹œ
public class LoginController {
	
	// ๋กœ๊ทธ ์ฐ๊ธฐ ์œ„ํ•œ Logger๊ฐ์ฒด ์ƒ์„ฑ
	private static final Logger logger = LoggerFactory.getLogger(LoginController.class);
	
	// HTTP POST ์š”์ฒญ์„ /login ๊ฒฝ๋กœ์—์„œ ๋ฐ›์„ ๋•Œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ ์‹คํ–‰
	@PostMapping("/login")
	// ์š”์ฒญ ๋ณธ๋ฌธ์— JSON์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋Š”๋ฐ, ์ด ๋ฐ์ดํ„ฐ๋ฅผ LoginReequest ๊ฐ์ฒด๋กœ ๋ฐ”์ธ๋”ฉ
	public ResponseEntity<String> login(@RequestBody LoginRequest request){
		
		if(request.isSuccess()) {
			// ์„ฑ๊ณต ๋กœ๊ทธ
			logger.info("LOGIN_SUCCESS - password={}, country={}, timestamp={}, success={}",
					request.getPassword(),
					request.getCountry(),
					request.getTimestamp(),
					request.isSuccess());
			// ResponseEntity : ์‘๋‹ต์ฝ”๋“œ๊นŒ์ง€ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” Spring-web ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
			return ResponseEntity.ok("๋กœ๊ทธ์ธ ์„ฑ๊ณต");
		}else {
			// ์‹คํŒจ ๋กœ๊ทธ
			logger.warn("LOGIN_FAILED - password={}, country={}, timestamp={}, success={}, failureReason={}",
			        request.getPassword(),
			        request.getCountry(),
			        request.getTimestamp(),
			        request.isSuccess(),
			        request.getFailureReason());
			// HTTP 401(์ธ์ฆ ์‹คํŒจ/HttpStatus.UNAUTHORIZED) ์‘๋‹ต ๋ฐ˜ํ™˜ (๋กœ๊ทธ์ธ์‹คํŒจ)
			return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("๋กœ๊ทธ์ธ ์‹คํŒจ");


		}
	}
	
}



<!--logback-spring.xml์—์„œ JSON๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
<!-- ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์ด logstash์ธ ์ด์œ  : logstash์— ์ž˜ ๋“ค์–ด๊ฐ€๋„๋ก ๋กœ๊ทธ๋ฅผ JSONํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
<!-- Logback์— JSONํฌ๋งท ์ถœ๋ ฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ-->
<dependency>
	<groupId>net.logstash.logback</groupId>
	<artifactId>logstash-logback-encoder</artifactId>
	<version>7.4</version>
</dependency>

๐Ÿ“Œ JMeter

  • CSV ๊ธฐ๋ฐ˜ 200,000๊ฑด์˜ ๋กœ๊ทธ์ธ ์‹œ๋„
image

โœ… ์Šค๋ ˆ๋“œ ์ˆ˜(์‚ฌ์šฉ์ž):10000 ๊ฐ€์ƒ์˜ ์‚ฌ์šฉ์ž ์ˆ˜ (= ๋™์‹œ์— ์š”์ฒญ ๋ณด๋‚ผ ์‚ฌ์šฉ์ž ์ˆ˜) ์—ฌ๊ธฐ์„  10,000๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋จ

โœ… ๋žจํ”„์—… ๊ธฐ๊ฐ„(์ดˆ):15 10,000๋ช…์˜ ์‚ฌ์šฉ์ž๋ฅผ 15์ดˆ ๋™์•ˆ ๋‚˜๋ˆ ์„œ ์‹คํ–‰ โ†’ 10000 รท 15 = ์•ฝ 666๋ช…/์ดˆ ์†๋„๋กœ ํˆฌ์ž…๋จ ์ˆซ์ž๊ฐ€ ์ž‘์„์ˆ˜๋ก ๋ถ€ํ•˜๊ฐ€ ๊ธ‰๊ฒฉํžˆ ๋ชฐ๋ฆผ

โœ… ๋ฃจํ”„ ์นด์šดํŠธ:20 ๊ฐ ์‚ฌ์šฉ์ž๋‹น ์š”์ฒญ์„ ๋ช‡ ๋ฒˆ ๋ฐ˜๋ณตํ• ์ง€ ์„ค์ • โ†’ ์‚ฌ์šฉ์ž 1๋ช…์ด 20๋ฒˆ ์š”์ฒญ์„ ๋ณด๋ƒ„ ์ด ์š”์ฒญ ์ˆ˜ = ์‚ฌ์šฉ์ž ์ˆ˜ ร— ๋ฃจํ”„ ์ˆ˜ = 10,000 ร— 20 = 20๋งŒ


image โœ… View Result Tree ์š”์ฒญ๋ณ„ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€, ์‘๋‹ต ์ฝ”๋“œ, ์š”์ฒญ/์‘๋‹ต ๋‚ด์šฉ์„ ์ƒ์„ธํžˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋””๋ฒ„๊น… ๋„๊ตฌ
๋กœ๊ทธ์ธ ์„ฑ๊ณต/์‹คํŒจ ๋ฉ”์‹œ์ง€, ์˜ค๋ฅ˜ ์‘๋‹ต, ํŒŒ๋ผ๋ฏธํ„ฐ ํ™•์ธ ๋“ฑ์— ํ™œ์šฉ

๐Ÿ“Œ Filebeat โ†’ Logstash

  • Filebeat๋กœ ๋กœ๊ทธ ์ˆ˜์ง‘

  • Logstash์—์„œ grok, mutate, date ํ•„ํ„ฐ ์‚ฌ์šฉํ•ด JSON ๋กœ๊ทธ ํŒŒ์‹ฑ

โŒจ๏ธ์ฝ”๋“œ
input {
#   file {
#     path => "C:/fisa_project/dummy_data/logs/ianlogin.log"   
#     start_position => "beginning"
#     sincedb_path => "NUL"      
#     codec => "json"
#   }
  beats{
    port => 5044
  }
}
filter {
  grok {
    match => {
      "message" => "password=%{DATA:password}, country=%{DATA:country}, timestamp=%{TIMESTAMP_ISO8601:timestamp}, success=%{WORD:success}(?:, failureReason=%{DATA:failureReason})?"
    }
  }

  date {
    match => ["timestamp", "yyyy-MM-dd'T'HH:mm:ss"]
    target => "@timestamp"
    timezone => "Asia/Seoul"
  }

  mutate {
    remove_field => ["message", "logger_name", "thread_name", "level", "@version", "path", "host", "timestamp"]
  }
}


output {
  stdout { codec => rubydebug }  # ์ฝ˜์†” ํ™•์ธ์šฉ
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "lastianlog"
  }
}


- `start_position`, `sincedb_path`๋กœ ์ˆ˜์ง‘ ๋ฒ”์œ„ ์ œ์–ด <br>

๐Ÿ“Œ Elasticsearch

  • ํŒŒ์‹ฑ๋œ ๋กœ๊ทธ๋ฅผ Elasticsearch์— ์ƒ‰์ธ
image

๐Ÿ“Œ Kibana

  • ์‹ค์‹œ๊ฐ„ ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์ถ•
image


๐Ÿ“Š Kibana ์‹œ๊ฐํ™” ๋‚ด์šฉ

์‹œ๊ฐํ™” ํ•ญ๋ชฉ ์ด๋ฏธ์ง€ ์„ค๋ช…
1. ๋กœ๊ทธ์ธ ์„ฑ๊ณต/์‹คํŒจ ๋น„์œจ ํ™”๋ฉด ์บก์ฒ˜ 2025-07-18 085422 ์ „์ฒด ๋กœ๊ทธ์ธ ์‹œ๋„ ์ค‘ ์„ฑ๊ณต 72.8%, ์‹คํŒจ 27.2%
2. ๊ตญ๊ฐ€๋ณ„ ๋กœ๊ทธ์ธ ์„ฑ๊ณต ํšŸ์ˆ˜ ํ™”๋ฉด ์บก์ฒ˜ 2025-07-18 084330 ๊ตญ๊ฐ€๋ณ„ ๋กœ๊ทธ์ธ ์„ฑ๊ณต ๊ฑด์ˆ˜ ๋น„๊ต
3. ์›”๋ณ„ ๋กœ๊ทธ์ธ ์‹œ๋„๋Ÿ‰ ๋ถ„ํฌ ํ™”๋ฉด ์บก์ฒ˜ 2025-07-18 092305 ๊ตญ๊ฐ€๋ณ„ ๋กœ๊ทธ์ธ ์‹œ๋„๋ฅผ ์›” ๋‹จ์œ„๋กœ ์‹œ๊ฐํ™”
4. ๋น„๋ฐ€๋ฒˆํ˜ธ ์ผ์น˜ ์—ฌ๋ถ€ + ์—ฐ๋„ ํ™”๋ฉด ์บก์ฒ˜ 2025-07-18 093807 ๋น„๋ฐ€๋ฒˆํ˜ธ ์ผ์น˜/๋ถˆ์ผ์น˜ ์—ฌ๋ถ€์™€ ์—ฐ๋„๋ณ„ ์‹œ๋„ ๋ถ„์„
5. ๊ตญ๊ฐ€๋ณ„ ๋กœ๊ทธ์ธ ์‹œ๋„ ๋น„์œจ ํ™”๋ฉด ์บก์ฒ˜ 2025-07-18 100221 ๋กœ๊ทธ์ธ ์‹œ๋„๋ฅผ ๊ตญ๊ฐ€๋ณ„ ๋น„์œจ๋กœ ๋ฉด์ ํ™”

๐Ÿ›  ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋ชจ์Œ

โœ… JMeter CSV ์ฒซ ์—ด ์ฝ์Œ ์—ฌ๋ถ€ - CSV ์ฒซ ์—ด์ด ์ปฌ๋Ÿผ๊ฐ’์œผ๋กœ, JMeter๊ฐ€ ์ฝ๋Š” ๋ฐ์ดํ„ฐ์—์„œ๋Š” ๋น ์กŒ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ์ฝ์Œ
  • ignore first line ์˜ต์…˜์„ True๋กœ ์„ค์ •ํ•˜์—ฌ csvํŒŒ์ผ ์ปฌ๋Ÿผ๋ช…์„ ๋ฌด์‹œํ•˜๊ณ  ์ฝ์Œ image
โœ… CSV boolean ํŒŒ์‹ฑ ์˜ค๋ฅ˜ - "True" / "False" ๋Œ€๋ฌธ์ž ๊ฐ’์ด DB์—์„œ boolean ๋งคํ•‘ ์‹คํŒจ โ†’ ํ…์ŠคํŠธ ํŒŒ์ผ์—์„œ True ์™€ False์˜ ๋Œ€๋ฌธ์ž์—ด์„ ์ผ๊ด„์ ์œผ๋กœ ์†Œ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝ
โœ… JMeter ์‹คํ–‰ ์‹œ๊ฐ„ ๋ถ€์กฑ Duration ์„ค์ •์ด ์งง์•„ ์ผ๋ถ€ ํŠธ๋ž˜ํ”ฝ๋งŒ ์ „์†ก๋จ
  • ํŠนํžˆ Thread Group > Duration, Scheduler, Ramp-Up ์„ค์ •์ด ์งง์œผ๋ฉด ์ „์ฒด ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ ์ข…๋ฃŒ๋จ

โ†’ Thread Group ์„ค์ •์—์„œ Duration 10์ดˆ โ†’ 20์ดˆ ์ด์ƒ์œผ๋กœ ์„ค์ •

image ์ƒ์„ฑ๋œ ๋กœ๊ทธ ๋ผ์ธ์ˆ˜ ํ™•์ธ ๋ช…๋ น์–ด
wc -l login.log
โœ… Logstash ๊ฒฝ๋กœ ์„ค์ • ์ด์Šˆ - ํŒ€์› ๊ฐ„ ๋กœ๊ทธ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ๋‹ฌ๋ผ ์‹คํ–‰ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • Logstash๋Š” ์ง€์ •๋œ ๋กœ์ปฌ ์ ˆ๋Œ€ ๊ฒฝ๋กœ์—์„œ ๋กœ๊ทธ๋ฅผ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅด๋ฉด ์ˆ˜์ง‘ ์ž์ฒด๊ฐ€ ๋˜์ง€ ์•Š์Œ

  • No such file or directory ์˜ค๋ฅ˜ ๋ฐœ์ƒ

โ†’ ๊ณตํ†ต ๊ฒฝ๋กœ ํ†ต์ผ ๋ฐ .conf ํŒŒ์ผ ๋‚ด ์ฃผ์„์œผ๋กœ ์ฃผ์˜์‚ฌํ•ญ ๋ช…์‹œ

โœ… Elasticsearch ์ธ๋ฑ์Šค ์ค‘๋ณต ๋ฌธ์ œ - ๋กœ๊ทธ ํŒŒ์ผ ์ˆ˜์ • ๋˜๋Š” ์žฌํ…Œ์ŠคํŠธ ํ›„ ๋™์ผํ•œ ๋กœ๊ทธ ํŒŒ์ผ์„ ๋‹ค์‹œ Logstash๋กœ ๋„˜๊ธฐ๋ ค ํ–ˆ์œผ๋‚˜ Elasticsearch์— ๊ธฐ์กด ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•ด ์ƒˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์žฌ๋˜์ง€ ์•Š์Œ
  • ๋กœ๊ทธ ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ๋‚ด์šฉ์€ ๋™์ผํ•˜์ง€๋งŒ ์ด์ „์— ์ฒ˜๋ฆฌ๋œ ์ƒํƒœ๋กœ ์ธ์‹๋จ

  • Filebeat๋‚˜ Logstash๋Š” ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌํ•œ ํŒŒ์ผ์„ ๋‚ด๋ถ€ ์ƒํƒœ(sincedb ๋“ฑ)์— ๊ธฐ๋ก โ†’ ๋™์ผ ๊ฒฝ๋กœ/๋‚ด์šฉ์˜ ํŒŒ์ผ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  ๋ฌด์‹œํ•จ

  • Elasticsearch ์ธ๋ฑ์Šค๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ๋ฌธ์„œ ID ์ค‘๋ณต ๋˜๋Š” ํŒŒ์‹ฑ ์‹คํŒจ๋กœ skip

โœ… Filebeat ๋กœ๊ทธ ํŒŒ์‹ฑ ๋ฉ”ํƒ€ ํ•„๋“œ๋งŒ ์ถœ๋ ฅ๋˜๋Š” ๋ฌธ์ œ - ๋กœ๊ทธ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ๊ณผ์ •์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„๋“œ๋งŒ ๋‚˜ํƒ€๋‚˜๊ณ , ์ •์ž‘ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€(message)๊ฐ€ ๋ณด์ด์ง€ ์•Š์Œ.

log.file.path: C:\fisa_project\dummy_data\logs\ianlogin.log  
agent.name: 1-01  
agent.version: 7.11.2  
tags: [ "_grokparsefailure" ]  

์ด ํ˜„์ƒ์€ ๋กœ๊ทธ ํŒŒ์‹ฑ ์‹คํŒจ ์‹œ ๋‚˜ํƒ€๋‚˜๋Š” ์ •์ƒ์ ์ธ ํ˜„์ƒ์œผ๋กœ, Filebeat๋Š” ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ์‹ฑํ•˜์ง€ ๋ชปํ•˜๋”๋ผ๋„ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”ํƒ€ ํ•„๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ Elasticsearch์— ์ „์†ก.


๐Ÿ“‘ Elasticsearch ์ž๋™ ์ƒ์„ฑ ํ•„๋“œ ์š”์•ฝ

ํ•„๋“œ๋ช… ์„ค๋ช…
@timestamp ๋กœ๊ทธ๊ฐ€ ์ˆ˜์ง‘๋œ ์‹œ๊ฐ„ (Filebeat๊ฐ€ ์ˆ˜์ง‘ํ•œ ์‹œ์  ๊ธฐ์ค€)
_index ๋กœ๊ทธ๊ฐ€ ์ €์žฅ๋œ ์ธ๋ฑ์Šค ์ด๋ฆ„ (์˜ˆ: ianlogend)
_id Elasticsearch๊ฐ€ ๋ถ€์—ฌํ•œ ๋ฌธ์„œ ๊ณ ์œ  ID
_type ๋ฌธ์„œ ํƒ€์ž… (๋ณดํ†ต _doc)
_score ๊ฒ€์ƒ‰ relevance ์ ์ˆ˜ (๊ธฐ๋ณธ ๊ฒ€์ƒ‰ ์‹œ -)
log.file.path ์‹ค์ œ ๋กœ๊ทธ ํŒŒ์ผ์˜ ์ „์ฒด ๊ฒฝ๋กœ
log.offset ๋กœ๊ทธ ํŒŒ์ผ ๋‚ด์—์„œ ์ด ๋กœ๊ทธ๊ฐ€ ์‹œ์ž‘๋œ ๋ฐ”์ดํŠธ ์œ„์น˜
agent.name Filebeat๊ฐ€ ์‹คํ–‰๋œ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„
agent.hostname ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ (๋ณดํ†ต agent.name๊ณผ ๋™์ผ)
agent.type ์ˆ˜์ง‘ ์—์ด์ „ํŠธ ์œ ํ˜• (์—ฌ๊ธฐ์„  filebeat)
agent.version Filebeat ๋ฒ„์ „ (์˜ˆ: 7.11.2)
agent.id Filebeat ์ธ์Šคํ„ด์Šค ๊ณ ์œ  ์‹๋ณ„์ž
agent.ephemeral_id ์‹คํ–‰ ์ค‘์ธ Filebeat ํ”„๋กœ์„ธ์Šค์˜ ๊ณ ์œ  ID (๋งค ์‹คํ–‰ ์‹œ ๋ณ€๊ฒฝ๋จ)
input.type ์ž…๋ ฅ ํƒ€์ž… (log, stdin ๋“ฑ)
tags ํŒŒ์‹ฑ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํƒœ๊ทธ (์˜ˆ: _grokparsefailure)
ecs.version Elastic Common Schema ๋ฒ„์ „ (1.6.0 ๋“ฑ)

๐Ÿš€ ํ–ฅํ›„ ๋ฐœ์ „ ๋ฐฉํ–ฅ (Develop Direction)

  • โœ… ๋”๋ฏธ๋ฐ์ดํ„ฐ ๋Œ€์‹  ์‹ค์ œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋ถ„์„์˜ ํ˜„์‹ค์„ฑ ํ–ฅ์ƒ

  • โœ… ์ตœ์‹  Kibana ๊ธฐ๋Šฅ(Lens, Canvas ๋“ฑ)์„ ํ™œ์šฉํ•œ ๊ณ ๊ธ‰ ๋Œ€์‹œ๋ณด๋“œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๋ฐ ์•Œ๋ฆผ ๊ธฐ๋Šฅ ๊ตฌํ˜„

  • โœ… ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋ฐ˜ ํƒ์ง€ ๋ชจ๋ธ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์ด์ƒ ํ–‰์œ„ ํƒ์ง€ ์ž๋™ํ™” ๋ฐ ์‹ค์‹œ๊ฐ„ ๋Œ€์‘ ์ฒด๊ณ„ ๊ตฌ์ถ•

  • โœ… Slack / Email ๋“ฑ ์•Œ๋ฆผ ์‹œ์Šคํ…œ๊ณผ์˜ ์—ฐ๋™์„ ํ†ตํ•ด ์‹คํŒจ์œจ ๊ธ‰์ฆ ๋“ฑ ์ด์ƒ ์ƒํ™ฉ์— ์ฆ‰์‹œ ๋Œ€์‘

  • โœ… ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๊ณ ๊ฐ€์šฉ์„ฑ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋ฅผ ํ†ตํ•ด ํ™•์žฅ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ฐ–์ถ˜ ELK ํ™˜๊ฒฝ ๊ตฌ์„ฑ


๐Ÿ““ ํšŒ๊ณ 

๐Ÿ‘ค ๊ฐ•ํ•œ์†”

  • ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ๋‹จ์ˆœํ•œ ๋กœ๊ทธ ์ˆ˜์ง‘์„ ๋„˜์–ด, ๋ฐ์ดํ„ฐ์˜ ์„ค๊ณ„๋ถ€ํ„ฐ ์ƒ์„ฑ, ์ •์ œ, ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌํ˜„, ๊ทธ๋ฆฌ๊ณ  ์‹œ๊ฐํ™” ๋ถ„์„์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์ „ ๊ณผ์ •์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ง„ ๊ธฐํšŒ์˜€์Šต๋‹ˆ๋‹ค.
    ์ง„ํ–‰ ๊ณผ์ •์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…๋„ ๋งŽ์•˜๊ณ , ๊ธฐ์ˆ ์  ๋‚œ๊ด€์— ๋ถ€๋”ชํžˆ๋Š” ์ˆœ๊ฐ„๋„ ์ ์ง€ ์•Š์•˜์ง€๋งŒ, ๊ทธ๋งŒํผ ์ง์ ‘ ๋ถ€๋”ชํžˆ๋ฉฐ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ์–ป์€ ๋ฐฐ์›€์€ ๋งค์šฐ ์ปธ์Šต๋‹ˆ๋‹ค.
    ํŠนํžˆ ๋กœ๊ทธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์กฐํ™”๋˜๊ณ , ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ด์ง€๋Š”์ง€๋ฅผ ์ฒด๊ฐํ•˜๋ฉฐ, ๋‹จ์ˆœํ•œ ๊ตฌํ˜„์„ ๋„˜์–ด ์‹œ์Šคํ…œ ์ „๋ฐ˜์„ ๋ฐ”๋ผ๋ณด๋Š” ๊ด€์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์š”๊ตฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์•ˆ์ •์„ฑ, ์œ ์—ฐ์„ฑ, ๊ฐ€์‹œ์„ฑ์˜ ์ค‘์š”์„ฑ๋„ ๊นจ๋‹ฌ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    ๋Œ์ด์ผœ๋ณด๋ฉด ํ—˜๋‚œํ–ˆ์ง€๋งŒ, ๊ทธ๋งŒํผ ์„ฑ์žฅ์˜ ๋ฐ€๋„๊ฐ€ ๋†’์•˜๋˜ ํ”„๋กœ์ ํŠธ์˜€๋‹ค๊ณ  ์ž์‹  ์žˆ๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ค ์ด์ œํ˜„

  • ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ํ”„๋กœ์ ํŠธ์— ์ฒ˜์Œ ๋„์ „ํ–ˆ์ง€๋งŒ, ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ๊ณ„๋ณ„ ๊ตฌํ˜„ํ•˜๋ฉฐ ์‹ค์ „ ๊ฐ๊ฐ์„ ์ตํžˆ๋Š” ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.
    JMeter๋ฅผ ํ™œ์šฉํ•ด JSON ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋ฉฐ, Spring ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์˜ ํ๋ฆ„์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๊ธฐ์ˆ  ์Šคํƒ์„ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ๋กœ๊น… ํ๋ฆ„์„ ์ฒดํ—˜ํ•˜๋ฉฐ, ์‹ค๋ฌด์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ ์—ญ๋Ÿ‰์„ ์Œ“์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ค ์ „์ˆ˜๋ฏผ

  • ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๋‚ด์šฉ์ด๋ผ ๋‹ค์†Œ ์–ด๋ ค์›€์ด ์žˆ์—ˆ์ง€๋งŒ, ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ํ˜‘๋ ฅํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์™„์„ฑํ•ด ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    ํŒŒ์ดํ”„๋ผ์ธ์„ ์ฒ˜์Œ ๊ตฌ์ถ•ํ•  ๋•Œ๋Š” ๋‹ค์†Œ ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์กŒ์ง€๋งŒ, ์‹ค์Šต์„ ํ†ตํ•ด ์ „์ฒด์ ์ธ ํ๋ฆ„๊ณผ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋งค์šฐ ๋œป๊นŠ์€ ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.
    ํŠนํžˆ ELK๋ฅผ ์ง์ ‘ ๋‹ค๋ค„๋ณด๋ฉด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ˆ˜์ง‘๋˜๊ณ  ์‹œ๊ฐํ™”๋˜๋Š”์ง€๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด ์œ ์ตํ•œ ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ค ํ™ฉ๋ณ‘๊ธธ

  • JMeter๋กœ 20๋งŒ ๊ฑด ๋Œ€๊ทœ๋ชจ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์™€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ค๊ณ„ํ•˜๊ณ , ์ง์ ‘ ์ƒ์„ฑํ•œ ๋กœ๊ทธ์ธ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Filebeat-Logstash-Kibana๋ฅผ ์—ฐ๊ณ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•์˜ ๋ณต์žก์„ฑ ์ดํ•ด์™€ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , JMeter๋ฅผ ํ™œ์šฉํ•ด์„œ ์ง์ ‘ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์…‹์„ ๊ฐ€์ ธ์™€์„œ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์˜๋ฏธ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
    ํŒŒ์ดํ”„๋ผ์ธ์ด ๊ตฌ์ถ•๋œ ํ›„์—๋„ ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํŠœ๋‹์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ตฌ์ถ•, ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋ฐ˜ ์ด์ƒ ํƒ์ง€ ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€ํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages