[Logback/k6] Rolling File Appenders 샘플 및 k6 테스트

    728x90
    반응형

    Rolling File Appender

    What is Rolling?

    로그 파일을 관리하는 데 사용되는 기능
    로그 파일의 크기나 시간에 따라 새 파일로 롤링(전환)하도록 설정하는 방법이다.

     

    How to use Rolling Appenders?

    [root@]$ cat logback.xml
    
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="false">
        <!-- 로그 파일 경로를 정의하는 프로퍼티 -->
        <property name="LOGS_ABSOLUTE_PATH" value="로그가 생성될 경로" />
    
        <!-- 로그 파일을 처리하는 RollingFileAppender 정의 -->
        <appender name="applogfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 로그 파일의 기본 위치와 이름을 지정. 변수를 사용하여 동적으로 파일 이름을 설정 -->
            <!-- 새로운 로그가 쌓이는 로그 파일의 파일명 -->
            <file>${LOGS_ABSOLUTE_PATH}/online/app_${변수명}.log</file>
    
            <!-- 로그 메시지 형식을 정의. 타임스탬프, 로그 레벨, 로그 발생 지점, 메시지를 포함 -->
            <!-- 로그가 로그 파일에 어떤 형식으로 쌓일지 로그 포맷을 정의 -->
            <encoder>
                <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5level][%logger{36}:%line] - %msg%n</pattern>
            </encoder>
    
            <!-- 롤링 정책 정의: 파일 사이즈와 시간 기반으로 로그 파일을 롤링 -->
            <!-- SizeAndTimeBasedRollingPolicy: 파일 사이즈와 시간 기반으로 롤링 -->
            <!-- TimeBasedRollingPolicy: 시간 기반으로 롤링 -->
            <!-- SizeBasedRollingPolicy: 파일 사이즈 기반으로 롤링 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!-- 롤링된 파일의 이름 패턴. 날짜와 인덱스를 포함하여 여러 파일을 생성 -->
                <!-- %i: 롤링되는 파일의 인덱스. %i를 작성해야 정상적으로 로깅됨 -->
                <!-- app_ARCHITALKS.2024-12-06.log-0 포맷으로 롤링됨 -->
                <fileNamePattern>${LOGS_ABSOLUTE_PATH}/online/app_${변수명}.%d{yyyy-MM-dd}.log-%i</fileNamePattern>
    
                <!-- 파일 크기가 100MB를 초과하면 롤링을 트리거 -->
                <maxFileSize>100MB</maxFileSize>
    
                <!-- 최대 30개의 백업 파일을 보관 -->
                <maxHistory>30</maxHistory>
    
                <!-- 로그 파일의 총 크기 제한. 1GB를 넘지 않도록 설정 --
                <!-- 로그 파일이 생성되는 디렉토리가 1GB를 초과하면 자동으로 로그 파일을 삭제 -->
                <totalSizeCap>1GB</totalSizeCap>
            </rollingPolicy>
        </appender>
    
        <!-- 로그 레벨을 "debug"로 설정하고, applogfile appender를 root logger에 추가 -->
        <root level="debug">
            <appender-ref ref="applogfile" />
        </root>
    
    </configuration>

    k6

    What is k6?

    성능 테스트 및 부하 테스트를 위한 오픈 소스 도구
    주로 웹 애플리케이션 및 API의 부하 테스트를 수행하는 데 사용된다.

     

    How To Install k6 in Windows

    #Chocolatey 패키지 관리자 사용하여 k6 설치
    #[관리자 권한]PowerShell에서 아래의 명령어를 입력해 설치한다.
    
    Windows PowerShell
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    새로운 크로스 플랫폼 PowerShell 사용 https://aka.ms/pscore6
    
    PS C:\Users\architalks>

     

    Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

     

    #k6 설치
    choco install k6

     

    #k6가 정상적으로 설치되었는지 확인
    k6 version

     

    How to use k6

    #k6 테스트를 위한 스크립트 생성
    
    // k6의 http 모듈을 임포트하여 HTTP 요청을 보낼 수 있게 함
    import http from 'k6/http';
    // k6의 sleep 함수를 임포트하여 요청 간 대기 시간을 설정할 수 있게 함
    import { sleep } from 'k6';
    
    // 테스트 실행 옵션 설정
    export let options = {
        // VUs (Virtual Users): 테스트를 실행할 가상 사용자의 수
        vus: 100,
        // iterations: 각 가상 사용자가 실행할 요청 횟수 (총 요청 수는 vus * iterations)
        iterations: 1000,
    };
    
    // 기본적으로 실행될 함수 (각 VU에서 반복적으로 실행됨)
    export default function () {
        // 요청 본문 (payload) 설정: JSON 형식의 데이터
        let payload = JSON.stringify({
            header: {
                필드1: '값1',
                필드2: '값2',
            },
            body: {
                필드3: '값3',
                필드4: '값4',
            }
        });
    
        // 요청 헤더 설정 (JSON 형식으로 요청을 보낼 것임)
        let params = {
            headers: {
                'Content-Type': 'application/json', // JSON 형식의 데이터를 보내도록 Content-Type 설정
            },
        };
    
        // HTTP POST 요청을 보내는 부분
        // URL: 'http://localhost:8090/hello'
        // payload: 요청 본문 (JSON 형식)
        // params: 요청 헤더 (Content-Type: application/json)
        let res = http.post('http://localhost:8090/hello', payload, params);
    
        // 각 요청 후 5초 동안 대기 (sleep 함수 사용)
        sleep(5); // 이 대기는 가상 사용자들 사이에서 요청 간 대기 시간을 설정함
    }

     

    #k6 부하테스트 실행
    [root@]$ k6 run 스크립트명.js
    
    
             /\      Grafana   /‾‾/
        /\  /  \     |\  __   /  /
       /  \/    \    | |/ /  /   ‾‾\
      /          \   |   (  |  (‾)  |
     / __________ \  |_|\_\  \_____/
    
         execution: local
            script: rollingPolicyFromk6.js
            output: -
    
         scenarios: (100.00%) 1 scenario, 100 max VUs, 10m30s max duration (incl. graceful stop):
                  * default: 1000 iterations shared among 100 VUs (maxDuration: 10m0s, gracefulStop: 30s)
    
    
    running (00m22.8s), 100/100 VUs, 300 complete and 0 interrupted iterations
    default   [==========>---------------------------] 100 VUs  00m22.8s/10m0s  0300/1000 shared iters

     

    #k6 테스트 완료
    
         data_received..................: 1.1 MB 19 kB/s
         data_sent......................: 266 kB 4.4 kB/s
         http_req_blocked...............: avg=1.57ms   min=0s       med=0s       max=17.64ms p(90)=906.17µs p(95)=15.65ms
         http_req_connecting............: avg=1.56ms   min=0s       med=0s       max=17.64ms p(90)=543.47µs p(95)=15.65ms
         http_req_duration..............: avg=854.61ms min=113.28ms med=331.55ms max=6.91s   p(90)=1.52s    p(95)=4.91s
           { expected_response:true }...: avg=854.61ms min=113.28ms med=331.55ms max=6.91s   p(90)=1.52s    p(95)=4.91s
         http_req_failed................: 0.00%  0 out of 1000
         http_req_receiving.............: avg=340.82µs min=0s       med=290.5µs  max=1.13ms  p(90)=841.8µs  p(95)=939.81µs
         http_req_sending...............: avg=31.92µs  min=0s       med=0s       max=1.5ms   p(90)=0s       p(95)=216.53µs
         http_req_tls_handshaking.......: avg=0s       min=0s       med=0s       max=0s      p(90)=0s       p(95)=0s
         http_req_waiting...............: avg=854.24ms min=112.44ms med=331.54ms max=6.91s   p(90)=1.52s    p(95)=4.91s
         http_reqs......................: 1000   16.632156/s
         iteration_duration.............: avg=5.85s    min=5.11s    med=5.33s    max=11.93s  p(90)=6.53s    p(95)=9.92s
         iterations.....................: 1000   16.632156/s
         vus............................: 16     min=16        max=100
         vus_max........................: 100    min=100       max=100
    
    
    running (01m00.1s), 000/100 VUs, 1000 complete and 0 interrupted iterations
    default ✓ [======================================] 100 VUs  01m00.1s/10m0s  1000/1000 shared iters

     

    #롤링 적용 확인
    #totalSizeCap이 적용되어 0,1,2 삭제된 것 확인
    
    [root@]$ ls -al
    합계 170976
    drwxr-x---. 2 bom bom     4096 12월  6 16:49 .
    drwxr-xr-x. 5 bom bom       46  8월  7 10:41 ..
    -rw-r-----. 1 bom bom 10667507 12월  6 16:40 app_architalks_.2024-12-06.log-10
    -rw-r-----. 1 bom bom 11164670 12월  6 16:40 app_architalks_.2024-12-06.log-11
    -rw-r-----. 1 bom bom 10508676 12월  6 16:39 app_architalks_.2024-12-06.log-3
    -rw-r-----. 1 bom bom 10532652 12월  6 16:39 app_architalks_.2024-12-06.log-4
    -rw-r-----. 1 bom bom 11392556 12월  6 16:39 app_architalks_.2024-12-06.log-5
    -rw-r-----. 1 bom bom 10822893 12월  6 16:39 app_architalks_.2024-12-06.log-6
    -rw-r-----. 1 bom bom 11383250 12월  6 16:39 app_architalks_.2024-12-06.log-7
    -rw-r-----. 1 bom bom 10524339 12월  6 16:39 app_architalks_.2024-12-06.log-8
    -rw-r-----. 1 bom bom 10724563 12월  6 16:40 app_architalks_.2024-12-06.log-9
    -rw-r-----. 1 bom bom 75364222 12월  6 17:19 app_architalks_.log

     

     

    728x90
    반응형

    댓글