REDCap 최근 로그(Audit Log) 조회하기
REDCap은 프로젝트별로 모든 사용자 활동(데이터 입력, 수정, 내보내기, 로그인 등)을 redcap_log_event 테이블에 기록합니다. 운영 중 "마지막으로 무슨 일이 있었는지" 를 빠르게 확인하려면 데이터베이스에 직접 SQL을 날리는 것이 가장 확실합니다.
배경: 로그 테이블 구조
REDCap은 로그 데이터가 너무 커지는 것을 막기 위해 샤딩(sharding) 방식으로 로그 테이블을 여러 개 운용합니다.
redcap_log_event— 기본 로그 테이블redcap_log_event2,redcap_log_event3, …redcap_log_event9, … — 샤드별 테이블
프로젝트마다 어느 샤드에 기록되는지는 redcap_projects.log_event_table 컬럼을 보면 확인할 수 있습니다. 아래 예제에서는 redcap_log_event9 샤드에 쌓이는 프로젝트를 조회합니다. 환경에 맞게 테이블 이름만 바꿔주세요.
최근 로그 100건 조회 쿼리
SELECT
log_event_id,
project_id,
STR_TO_DATE(CAST(ts AS CHAR), '%Y%m%d%H%i%s') AS log_time,
user,
ip,
page,
event,
object_type,
pk,
event_id,
description
FROM redcap_log_event9
ORDER BY ts DESC
LIMIT 100;
컬럼 설명
| 컬럼 | 의미 |
|---|---|
log_event_id | 로그 고유 ID (PK) |
project_id | 어떤 프로젝트에서 발생했는지 |
log_time | ts 컬럼(예: 20260416153022)을 사람이 읽을 수 있는 DATETIME으로 변환한 값 |
user | 작업을 수행한 REDCap 계정 ID |
ip | 접속 IP |
page | 실행된 REDCap 페이지(스크립트) |
event | 이벤트 종류 (INSERT, UPDATE, DELETE, DATA_EXPORT, LOGIN_SUCCESS 등) |
object_type | 대상 객체 유형 (redcap_data, redcap_projects 등) |
pk | 대상 레코드의 PK |
event_id | 이벤트(arm/event) 식별자 |
description | 사람이 읽을 수 있는 설명 |
왜 STR_TO_DATE(CAST(ts AS CHAR), ...) 를 쓰는가
ts 컬럼은 BIGINT 타입으로 YYYYMMDDHHMMSS 형식의 숫자가 들어있습니다. 그대로 보면 20260416153022 같은 14자리 숫자라 읽기 어렵기 때문에, 문자열로 캐스팅한 뒤 STR_TO_DATE로 DATETIME으로 변환해줍니다.
자주 쓰는 변형 쿼리
특정 프로젝트의 최근 로그만 보기
SELECT
STR_TO_DATE(CAST(ts AS CHAR), '%Y%m%d%H%i%s') AS log_time,
user, event, object_type, pk, description
FROM redcap_log_event9
WHERE project_id = 123
ORDER BY ts DESC
LIMIT 100;
특정 사용자의 최근 활동
SELECT
STR_TO_DATE(CAST(ts AS CHAR), '%Y%m%d%H%i%s') AS log_time,
project_id, event, description
FROM redcap_log_event9
WHERE user = 'some_user_id'
ORDER BY ts DESC
LIMIT 100;
최근 1시간 내 데이터 변경만
SELECT
STR_TO_DATE(CAST(ts AS CHAR), '%Y%m%d%H%i%s') AS log_time,
project_id, user, event, pk, description
FROM redcap_log_event9
WHERE ts >= DATE_FORMAT(NOW() - INTERVAL 1 HOUR, '%Y%m%d%H%i%s')
AND event IN ('INSERT', 'UPDATE', 'DELETE')
ORDER BY ts DESC;
데이터 내보내기(Export) 이력만
SELECT
STR_TO_DATE(CAST(ts AS CHAR), '%Y%m%d%H%i%s') AS log_time,
project_id, user, ip, description
FROM redcap_log_event9
WHERE event = 'DATA_EXPORT'
ORDER BY ts DESC
LIMIT 50;
팁
- 샤드 확인: 어떤 프로젝트가 어느 샤드에 기록되는지 모를 때는 다음 쿼리로 확인하세요.
SELECT project_id, app_title, log_event_tableFROM redcap_projectsWHERE project_id = 123;
- 인덱스:
ts에 인덱스가 걸려 있어ORDER BY ts DESC LIMIT N은 대체로 빠릅니다. 단,WHERE로 필터링할 때는project_id,user에도 인덱스가 있는지 확인하세요. - UI 대안: 관리자 UI의 Logging 페이지에서도 확인할 수 있지만, 전 프로젝트 범위 / 특정 IP / 특정 이벤트 타입으로 교차 조회하려면 SQL이 훨씬 편합니다.
- 주의: 운영 DB에 직접 접근하는 경우 읽기 전용 계정을 사용하거나, 읽기 복제본(replica)에서 조회하는 것을 권장합니다.