서비스 출시 및 운영
로그 데이터를 어떻게 저장하고 사용해야 할까
tenjobs
2024. 5. 13. 22:57
로그 데이터는 아주 중요하다.
아직 적재하기도, 사용해본 적도 없지만 SRE, DevOps, DA 등 다양한 분야에서 사용될 수 있다.
데이터를 어떻게 사용할 지에 따라 저장하는 방법도 달라진다.
- 특정 기능을 사용했을 때, 유저가 어디에 있는지 위/경도 저장
- 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 형식으로 재 변환을 한다고 했을 때, 로그 파일의 데이터를 파싱하는 것보다 바로 데이터프레임으로 가져와 사용하는 방식이 더 효율적일 것이다.
- RDB에 데이터를 적재한다고 가정해보자.
- 특정 기능을 사용했을 때, 유저의 취향을 분석알기 위해 데이터 저장
- 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에 큰 무리가 갈 수 있다.
- JSON 타입의 데이터가 포함된 로그에 있어서는 RDB에 적재하는 방식은 트래픽이 증가하여 초당 적재되는 로그 데이터 수가 상당히 많아졌을 때, 문제가 될 수 있다.
- 로그 파일 (.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 적재
- 스프링배치, cron 등을 통해 RDB -> NoSQL 적재
- 리눅스 명령어를 통해서 로그 파일에 쌓인 문자열 데이터를 가져와 파싱하는게 RDB에서 가져오는 것보다 더 나은 방식이라고 한다.
- RDB에 데이터를 적재한다고 가정해보자.
유사 테스트를 해보거나 해당 상황을 경험해본 게 아니라 아직 명확하게 뭐가 더 좋은 방법이다라고 말할 수 없다.
하지만 RDB에 많은 양의 데이터를 적재되는 것은 DB에 큰 무리가 갈 수 있음을 유의하자.