본문 바로가기
서비스 출시 및 운영

로그 데이터를 어떻게 저장하고 사용해야 할까

by 스티브 십잡스 2024. 5. 13.

로그 데이터는 아주 중요하다.

아직 적재하기도, 사용해본 적도 없지만 SRE, DevOps, DA 등 다양한 분야에서 사용될 수 있다.

 

데이터를 어떻게 사용할 지에 따라 저장하는 방법도 달라진다.

  1. 특정 기능을 사용했을 때, 유저가 어디에 있는지 위/경도 저장
    • RDB에 데이터를 적재한다고 가정해보자.
      CREATE TABLE user_pattern(
          id int unsigned auto_increment primary key,
          lat decimal(13,10) not null,
          lng decimal(13,10) not null,
          type varchar(20) not null,
          data text not null, -- 또는 varchar
          batch_yn enum('y','n') not null default 'n',
          created_at timestamp not null default current_timestamp,
          modified_at timestamp default null on update current_timestamp
      );
       
      •  type="LOCATION", data="광진구"
      •  법정구, 법정동 별 얼마나 많은 유저가 특정 기능을 사용했는지 시각화를 해야 한다면 RDB에 데이터를 적재하는 방식은 나쁘지 않다.  
    • 로그 파일 (.log)에 데이터를 적재한다고 가정해보자.
      •  이를 .csv 형식으로 재 변환을 한다고 했을 때, 로그 파일의 데이터를 파싱하는 것보다 바로 데이터프레임으로 가져와 사용하는 방식이 더 효율적일 것이다.
  2. 특정 기능을 사용했을 때, 유저의 취향을 분석알기 위해 데이터 저장
    • RDB에 데이터를 적재한다고 가정해보자.
      CREATE TABLE user_pattern(
          id int unsigned auto_increment primary key,
          lat decimal(13,10) not null,
          lng decimal(13,10) not null,
          type varchar(20) not null,
          data json not null,
          batch_yn enum('y','n') not null default 'n',
          created_at timestamp not null default current_timestamp,
          modified_at timestamp default null on update current_timestamp
      );
      •  JSON 타입의 데이터가 포함된 로그에 있어서는 RDB에 적재하는 방식은 트래픽이 증가하여 초당 적재되는 로그 데이터 수가 상당히 많아졌을 때, 문제가 될 수 있다.
        •  일정 기간 내에 적재된 몇 만 건의 데이터를 조회한 후, JSON 타입의 data 컬럼의 데이터를 파싱하는 건 DB에 큰 무리가 갈 수 있다.
    • 로그 파일 (.log)에 데이터를 적재한다고 가정해보자.
      {
          "event": {"id": 1, "lat": "127.02031", "lng": "37.2304210", "type": "PAYMENT", "data": {"store_id": 4, "item_id": [1,2,3], ...}}, 
          "path": "/order", 
          "method": "POST", 
          "trace_id": "0b40f863-c972-4263-a841-fd205644a007", 
          "level": "info", 
          "logger": "api.order", 
          "timestamp": "2024-05-13 21:55:30", 
          "thread_name": "AnyIO worker thread", 
          "process_name": "SpawnProcess-2"
      }
      •  리눅스 명령어를 통해서 로그 파일에 쌓인 문자열 데이터를 가져와 파싱하는게 RDB에서 가져오는 것보다 더 나은 방식이라고 한다.
        •  스프링배치, cron 등을 통해 RDB -> NoSQL 적재
          •  RDB에 접근하기 위해 서버 애플리케이션 API 호출
        •  cron을 통해 .log -> NoSQL 적재

 

유사 테스트를 해보거나 해당 상황을 경험해본 게 아니라 아직 명확하게 뭐가 더 좋은 방법이다라고 말할 수 없다.

하지만 RDB에 많은 양의 데이터를 적재되는 것은 DB에 큰 무리가 갈 수 있음을 유의하자.

'서비스 출시 및 운영' 카테고리의 다른 글

Python structlog  (0) 2024.05.03
[2] 디지털 잡지 iOS App 서비스  (0) 2024.03.27
[1] 디지털 잡지 iOS App 서비스  (0) 2024.03.27
Python logging  (0) 2024.02.19