본문으로 건너뛰기

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_timets 컬럼(예: 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_DATEDATETIME으로 변환해줍니다.

자주 쓰는 변형 쿼리

특정 프로젝트의 최근 로그만 보기

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_table
    FROM redcap_projects
    WHERE project_id = 123;
  • 인덱스: ts에 인덱스가 걸려 있어 ORDER BY ts DESC LIMIT N은 대체로 빠릅니다. 단, WHERE로 필터링할 때는 project_id, user에도 인덱스가 있는지 확인하세요.
  • UI 대안: 관리자 UI의 Logging 페이지에서도 확인할 수 있지만, 전 프로젝트 범위 / 특정 IP / 특정 이벤트 타입으로 교차 조회하려면 SQL이 훨씬 편합니다.
  • 주의: 운영 DB에 직접 접근하는 경우 읽기 전용 계정을 사용하거나, 읽기 복제본(replica)에서 조회하는 것을 권장합니다.