문서 작업 가이드
API 로그에서 타임스탬프 추출하고 변환하기
복사한 API 로그에서 Unix 초, 밀리초, 마이크로초, 나노초를 추출하고 단위와 정확한 UTC 결과를 로컬에서 검증하는 절차입니다.
작성 및 검수 SimpleWebUtils게시일: 검토일:
이 작업 흐름을 검증한 방법
이번 검증은 “짧은 카운터는 제외하고 네 단위 추출하기”의 정확한 입력과 Unix 타임스탬프 변환기를 짝지어 수행했습니다. “필요한 최소 맥락만 복사하기” 단계를 거쳐 “원본 시스템의 단위 확인하기” 이후 결과를 캡처해 예시와 비교했습니다. 명시적인 경계 질문은 “타임스탬프와 함께 비밀값 붙여넣기”, “자동 감지를 권위 있는 메타데이터로 쓰기”였습니다.
추출기는 초·밀리초·마이크로초·나노초 값을 각각 분류하고 짧은 duration 카운터는 제외했으며, Date가 표현하지 못하는 세부 정밀도는 별도로 보존했습니다.
문제 상황
API 추적 한 조각에는 created_at 초, 브라우저 이벤트 밀리초, 데이터베이스 마이크로초, tracing 필드 나노초가 이웃한 줄에 함께 있을 수 있습니다. 같은 조각에 상태 코드, 처리 시간, 요청 ID, 토큰, 사용자 정보도 섞입니다. 숫자만 따로 복사하면 필드와 줄 맥락을 잃어 결과를 검증하기 어렵고, 최근 값의 흔한 자릿수만 보고 단위를 추측하면 과거 값이나 앞에 0이 붙은 값을 잘못 분류할 수 있습니다. 쓸 만한 추출 절차는 입력 범위를 제한하고 비밀값을 지우며, 원본 맥락과 자동 판별 기준을 보여주고, 읽기 쉬운 밀리초 날짜에 모든 정밀도가 있다고 과장하지 않으면서 서브밀리초 값을 정확히 보존해야 합니다.
공식 출처와 표준
다음 공식 문서는 이 작업 흐름에서 다루는 형식과 보안 경계의 기준입니다. 도구별 실행 검증은 위에 별도로 기록합니다.
- RFC 3339: Date and Time on the Internet: Timestamps
RFC Editor / IETF
이럴 때 사용하세요
- 복사한 API 로그, 웹훅, 큐 이벤트, JSON 조각에 epoch처럼 보이는 값이 여러 개 있을 때
- 같은 디버깅 과정에서 서로 다른 생산자가 초, 밀리초, 마이크로초, 나노초를 사용할 때
- created_at, processed_at, received_at과 원본 줄 번호를 변환 결과에 붙여 둬야 할 때
- 12자리 과거 값처럼 최근 시점 자릿수 추정 대신 명시적 단위가 필요한 값이 있을 때
- 로그 본문을 변환 서버에 업로드하지 않고 비식별화된 보고서를 티켓에 남겨야 할 때
단계
- 1단계
필요한 최소 맥락만 복사하기
각 값을 식별할 필드명, 이벤트 종류, 이웃한 몇 줄만 남기세요. 디버깅 도구에 넣기 전에 Authorization 헤더, 쿠키, 원본 JWT, 이메일 주소, 불필요한 사용자 정보를 제거하세요.
- 2단계
필드명과 줄 경계 보존하기
숫자만 있는 목록으로 줄이지 마세요. created_at, duration_ms, sequence_id, received_at 같은 이름은 타임스탬프와 카운터를 구분하고 어떤 clock이 값을 만들었는지 설명하는 근거입니다.
- 3단계
원본 시스템의 단위 확인하기
가능하면 API schema, 데이터베이스 column, tracing 문서, 생산자 코드를 확인하세요. 자동 모드는 정수부 9~11자리를 초, 12~14자리를 밀리초, 15~17자리를 마이크로초, 18자리 이상을 나노초로 보지만 이 휴리스틱은 원본 메타데이터가 아닙니다.
- 4단계
한도 안의 표본 변환하기
UTF-8 기준 최대 200,000바이트, 200줄, 타임스탬프 후보 100개를 붙여넣으세요. 일반적인 여러 단위가 섞였을 때만 자동을 사용하고, 모든 후보가 문서화된 한 단위를 따르면 해당 단위를 직접 선택하세요.
- 5단계
단위와 정밀도 경고 읽기
각 감지 단위와 건너뛴 줄을 확인하세요. 정확한 epoch 문자열은 마이크로초와 나노초를 보존하지만 ISO, UTC, 로컬 Date 표시는 밀리초에서 끝나며 나머지가 있으면 경고합니다.
- 6단계
UTC 결과를 원본에 연결해 기록하기
유용한 각 행에 원본 필드명, 줄 번호, 선택하거나 감지한 단위, 정확한 epoch 값, ISO UTC 결과를 함께 보관하세요. 사용자 화면을 맞출 때만 브라우저 로컬 IANA 시간대를 사용하세요.
- 7단계
로그 밖의 기준 사건 하나로 검증하기
알고 있는 배포, 데이터베이스 레코드, 서명된 이벤트, 서버 Date 헤더 중 하나를 변환 행과 비교하세요. 날짜가 그럴듯하다는 이유만으로 해당 숫자가 타임스탬프이거나 자동 판별 단위가 맞다고 확정할 수 없습니다.
예시
짧은 카운터는 제외하고 네 단위 추출하기
입력
INFO created_at=1704067200 status=200
INFO updated_at=1704067200123 duration_ms=42
DEBUG processed_at=1704067200123456 request_id=req_demo
TRACE received_at=1704067200123456789 retries=3출력
1704067200 | 초 | 2024-01-01T00:00:00.000Z
1704067200123 | 밀리초 | 2024-01-01T00:00:00.123Z
1704067200123456 | 마이크로초 | 정확히 1704067200.123456초 | 날짜 표시는 .123Z
1704067200123456789 | 나노초 | 정확히 1704067200.123456789초 | 날짜 표시는 .123Z흔한 실수
타임스탬프와 함께 비밀값 붙여넣기
로컬 변환이 원본 토큰을 공유해도 안전하게 만들지는 않습니다. bearer token, 쿠키, session ID, 개인정보, 불필요한 식별자를 변환 전에 지우고 결과를 게시하기 전에도 다시 확인하세요.
긴 숫자를 모두 사건 시각으로 보기
주문 ID, snowflake ID, sequence 번호, byte counter도 epoch처럼 보일 수 있습니다. 그럴듯한 날짜를 근거로 삼기 전에 필드명과 생산자 schema를 확인하세요.
자동 감지를 권위 있는 메타데이터로 쓰기
자릿수는 실용적인 휴리스틱입니다. 과거 밀리초는 12자리일 수 있고 0 padding은 길이를 바꾸며 도메인마다 scale이 다를 수 있습니다. 문서가 있으면 명시적 단위를 사용하세요.
읽기 쉬운 밀리초 날짜만 복사하기
정확한 순서는 다른데 마이크로초·나노초 행의 ISO 표시가 같을 수 있습니다. 서브밀리초 순서가 중요하면 정확한 epoch 필드를 보관하세요.
브라우저 로컬 시간을 서버 값으로 게시하기
로컬 카드는 이름이 표시된 브라우저 IANA 시간대와 일광 절약 시간 규칙을 따릅니다. 기술 증거는 UTC로 기록하고 로컬 시간은 사용자 비교용임을 명확히 표시하세요.
자주 묻는 질문
짧은 상태 코드와 처리 시간은 왜 추출하지 않나요?
일괄 추출은 정수부가 최소 9자리여야 status=200, duration_ms=42 같은 값을 타임스탬프로 보지 않습니다. 숫자 하나만 입력한 경우에는 2001년 이전이나 epoch 이전 값을 확인할 수 있도록 짧은 값도 받습니다.
한 표본에 네 단위가 모두 있어도 되나요?
네. 자동 모드는 후보마다 따로 판별합니다. 표본 전체가 문서화된 한 단위를 따르면 명시적으로 선택해 자릿수보다 원본 계약을 우선하세요.
나노초 행의 ISO 결과는 왜 밀리초까지만 보이나요?
JavaScript Date와 ISO 출력의 정밀도가 밀리초이기 때문입니다. 변환기는 지원하는 모든 자릿수를 정확한 epoch 필드에 남기고 날짜 표시에 나머지가 있는 것처럼 보이지 않도록 경고합니다.
로컬 처리라면 운영 로그를 그대로 붙여넣어도 되나요?
아니요. 값은 변환 서버로 보내지 않고 동의 기반 분석도 집계 건수와 분류만 사용하지만, 운영 로그는 브라우저 기록, 스크린샷, 복사 결과, 티켓에 남을 수 있습니다. 먼저 비식별화하세요.
입력 한도를 넘으면 어떻게 되나요?
UTF-8 200,000바이트, 200줄, 후보 100개 중 하나라도 넘으면 알 수 없는 일부만 처리하지 않고 실제 값과 제한이 표시된 오류로 전체 변환을 거부합니다.
선택한 단위가 맞다는 것을 어떻게 확인하나요?
생산자 schema나 코드를 확인하고 적어도 한 값을 알려진 외부 사건과 비교하세요. 최근 날짜처럼 보인다는 사실만으로는 충분한 증거가 아닙니다.