1970년으로 표시된 로그 두 묶음을 시각이 가깝다는 이유로 붙였더니 서로 다른 부팅의 기록이 섞였다. DLT 형식의 장치 진단 로그를 나란히 보여 주는 뷰어에서 확인된 문제다. 달력 시각이 초기값으로 돌아간 장치는 다시 켜져도 비슷한 날짜와 시각을 기록할 수 있다. 화면에서 두 행이 같은 때를 가리킨다고 읽히면, 실제로는 함께 일어나지 않은 일을 한 사건처럼 추적하게 된다.

시각 비교의 오차를 줄이는 것으로는 이 문제를 해결할 수 없다. 비교하려는 두 기록이 어느 부팅에서 나왔는지 먼저 알아야 한다. 그렇다고 1970년 기록을 전부 버리면 시계가 맞춰지기 전의 동작을 놓친다. 이 사례에서는 로그 헤더에 있는 장치 식별 정보와 uptime, 즉 부팅 후 경과 시간을 함께 사용했다. 날짜가 초기값이어도 uptime은 별도로 진행할 수 있다.

첫 갈림은 시계 보정과 재부팅을 구별하는 데 있다. 날짜가 1970년에서 실제 날짜로 앞으로 뛰었어도 uptime이 이어지면 같은 부팅 안의 시계 보정으로 다룬다. 반대로 달력 시각과 uptime이 함께 뒤로 움직이거나 시계가 초기값으로 돌아가는 변화는 부팅 경계를 찾는 단서가 된다. 다만 지원하는 uptime 카운터의 한 바퀴 순환은 재부팅으로 오인하지 않도록 이어 계산한다. 파일이 교체됐다는 이유만으로도 새 부팅을 만들지는 않는다.

부팅 구간을 나눈 뒤에는 날짜가 맞춰진 행을 기준점으로 쓴다. 그 행의 달력 시각에서 uptime을 빼면 부팅 시작 시각을 추정할 수 있다. 여기에 선택한 행의 uptime을 더해 초기 날짜로 기록된 행의 시각을 재구성한다. 이 계산에 다른 부팅의 기준점을 가져오면 엉뚱한 날짜를 얻는다. 그래서 계산에 앞서 나눈 부팅 구간이 중요하다.

기준점 하나도 곧바로 믿지 않는다. 로그가 저장될 때의 지연이 시각에 섞일 수 있어서 이 구현은 여러 보정 관측값 중 지연이 덜 섞인 쪽을 기준으로 잡았다. 시계가 바뀌어 기준점을 교체할 때도 한 번 튄 값만으로 덮어쓰지 않고 이어지는 관측이 같은 변화를 지지하는지 확인한다.

연결할 때는 장치 식별 정보가 같고 추정한 부팅 시작 시각의 차이가 1초 이내인 후보를 찾는다. 이는 이 구현의 허용 오차이지 모든 장치에 통하는 기준은 아니다. 한쪽에서만 가장 가까워 보인다고 연결하지는 않는다. 양쪽에서 서로의 부팅 후보가 하나로 정해져야 한다. 기준점이 없거나 여러 부팅을 구별할 수 없으면 연결을 보류한다.

그 뒤의 시간 범위 검색도 선택된 부팅 안으로 제한한다. 시각을 재구성하는 계산만 고치고 검색이 모든 부팅을 훑게 두면 같은 초기 날짜를 가진 다른 기록이 다시 들어올 수 있다. 원래 행에 적힌 시각은 그대로 보존한다. 재구성한 시각은 기록을 연결하기 위한 해석이며 장치가 실제로 그 날짜를 써서 남겼다는 뜻은 아니다.

이 사례에는 명시적인 부팅 고유 식별자가 없었다. 헤더의 시각과 uptime으로 경계를 추정한 구현이므로 누락되거나 모호한 정보까지 해결했다고 말할 수 없다. 수정에서 바뀐 것은 연결을 허용하는 순서다. 먼저 같은 부팅의 후보를 정하고, 그 안에서 시간 범위를 검색한다. 날짜를 그럴듯하게 복원했어도 어느 부팅의 기록인지 정하지 못했다면 연결은 보류한 채로 남는다.

2026/11/13 10:27 2026/11/13 10:27