이벤트
무슨 일이 있었는지를 남기는 스테이션의 기록입니다. 경보와 발생 기록과 인터록의 영구 시간선이 실시간 진단 콘솔과 나란히 놓이고, 검색과 필터와 CSV/JSON 내보내기가 딸립니다.
이벤트는 "무슨 일이 있었나?"에 답하는 페이지입니다. 탐색 막대의 아래 묶음(검증, 이벤트, 에이전트, 설정, 계정)에 있으며 탭 넷을 담습니다. 경보, 발생 기록, 인터록은 스테이션의 이벤트 기록부에서 읽어 오는 영구 시간선이고, 콘솔은 모든 하위 시스템이 써 넣는 실시간 진단 흐름입니다. 페이지 머리글은 "경보, 발생 기록, 인터록의 영구 이력과 실시간 진단 콘솔입니다."라고 적혀 있습니다.
이 페이지를 보려면 이벤트 보기 권한(시스템 영역)이 필요합니다. 탐색 막대의 항목과 /events 주소가 둘 다 이 권한을 봅니다. 공장 출하 역할은 "로그인하지 않음"을 포함해 모두 기본으로 이 권한을 가지고 있고 Admin은 언제나 가지고 있습니다. 비어 있는 채로 만든 역할은 이 권한 없이 시작하며, 관리자는 Admin이 아닌 어떤 역할에서든 이 권한을 뺄 수 있습니다. 어느 탭에서든 내보내려면 이력 내보내기와 가져오기 권한이 더 필요합니다.
탭과 그 주소
| 탭 | 무엇을 나열하는가 | 주소 | 페이지 |
|---|---|---|---|
| 경보 | 지금 답을 기다리는 경보를, 경보 상태 전이의 영구 시간선 위에 놓고 보여 줍니다 | /events?view=alarms |
경보 |
| 발생 기록 | 실행 중에, 또는 실행 밖의 "항상" 감시가 관측한 모든 발생 기록의 변화 지점입니다 | /events?view=occurrences |
발생 기록 |
| 인터록 | 유닛의 정지 인터록 래치가 겪은 모든 상태 전이입니다 | /events?view=interlocks |
인터록 |
| 콘솔 | 실행 중인 프로그램의 마지막 진단 항목 500개입니다 | /events?view=console |
콘솔 |
페이지는 경보 탭으로 열립니다. 탭을 누르면 주소를 다시 쓰되 기존 주소를 대체하므로, 탭을 오간다고 해서 브라우저의 뒤로 가기 기록이 쌓이지 않습니다. view=를 달고 온 링크는 그 탭으로 바로 들어가며, 페이지가 모르는 값이면 그냥 경보 탭으로 열립니다. 상태 표시줄의 경보 표시(종 모양에 "발생 {0}건(미확인 {1}건)"이 붙으며, 경보가 발생해 있거나 확인을 기다리는 동안에만 그려집니다)가 경보 목록에 닿는 길도 이것입니다. 그 표시는 /events?view=alarms로 이동합니다. 세고 있는 것을 읽기도 하고 답하기도 하는 화면이 거기이지, 경보를 구성하는 Logic 페이지가 아니기 때문입니다.
콘솔은 다른 탭 뒤에 그대로 붙어 있으므로 끝 따라가기 상태와 스크롤 위치가 탭을 바꿔도 살아남습니다. 세 시간선도 각자의 검색, 필터, 행, 선택을 그대로 지닌 채 서로를 오갈 수 있습니다.
누가 보고 누가 내보낼 수 있는가
| 권한 | 이 페이지에서 열리는 것 | 없을 때 |
|---|---|---|
| 이벤트 보기 | 탐색 막대 항목, 주소, 그리고 모든 탭 | 항목이 그려지지 않고 주소도 거부됩니다 |
| 이력 내보내기와 가져오기 | 모든 탭의 내보내기(CSV, JSON)와 콘솔의 지원 패키지 만들기 | 내보내기 단추가 그려지지 않습니다. 그래도 처리기에 눌림이 닿으면 작업 기록 줄이 "이벤트를 내보내려면 이력 내보내기와 가져오기 권한이 필요합니다."라고 답합니다 |
| Logic 조작 | 경보 탭의 확인과 모두 확인 | 조작이 그려지지 않고, 행은 그대로 읽을 수 있습니다 |
| 설정 변경 | 콘솔의 수집 시작과 수집 정지 | 단추가 그려지지 않지만, 수집 상태는 화면 낭독기에 그대로 알립니다 |
권한은 연결마다 판정되므로, 다른 사용자로 로그인한 브라우저 회선은 자기 몫의 단추를 보게 되고, 로그인이나 로그아웃이나 역할 편집이 일어나면 곧바로 다시 그려집니다. 권한의 전체 목록은 권한에 있습니다.
세 시간선이 움직이는 방식
경보, 발생 기록, 인터록 탭은 하나의 행동 규칙을 함께 쓰므로 탭을 바꿔도 규칙이 달라지지 않습니다.
| 행동 | 자세히 |
|---|---|
| 창 | 각 탭은 검색과 필터와 고른 기간에 맞는 이벤트를 한 쪽에 500건씩 최신 순으로 나열합니다(같은 시각이면 기록된 순서로 가릅니다). 목록 아래의 최신과 이전이 기록부의 나머지를 한 쪽씩 걸어가며, 이 띠는 갈 쪽이 더 있을 때만 그려집니다. 가장 새로운 쪽은 기록부를 실시간으로 따라가고, 그 뒤의 쪽은 멈춰 있어서 지금 도착한 이벤트가 읽고 있는 줄을 아래로 밀어내지 않습니다. |
| 기간 | 날짜 상자 두 개, 시작일과 종료일이며 각각 읽는 기간의 한쪽 끝입니다. 빈 상자는 아무 경계도 아니므로 둘 다 비워 두면 기록부 전체를 읽고, 끝 경계로 고른 날은 그 마지막 순간까지 통째로 들어갑니다. 옆의 가위표가 둘을 지우고 탭을 첫 쪽으로 되돌립니다. |
| 검색 | 어떤 열을 찾는지 안내 문구가 알려 주는 입력란입니다(탭에 따라 이름, 메시지, 신호원, 모델, 유닛, 절차, 담당자). "포함"으로 대소문자 없이 맞추며, 입력을 멈춘 뒤 250밀리초 만에 걸립니다. 앞뒤 공백은 무시합니다. |
| 수준 필터 | 탭마다 목록이 하나씩 있습니다. 경보는 우선순위, 발생 기록은 심각도, 인터록은 상태 전이입니다. 바꾸면 기록부를 곧바로 다시 읽습니다. |
| 새로 고침 | 둥근 화살표 단추가 기록부를 다시 읽습니다. 도구 설명이 탭을 이름으로 부릅니다("경보 이벤트 새로 고침", "발생 기록 새로 고침", "인터록 이벤트 새로 고침"). 읽기가 도는 동안에는 흐려집니다. |
| 실시간 새로 고침 | 기록부에 커밋된 이벤트는 열린 탭을 스스로 다시 질의하게 하며, 한꺼번에 몰려도 읽기 한 번으로 묶입니다(마지막 커밋 뒤 약 200밀리초). 보고 있지 않은 탭은 돌아왔을 때 다시 읽습니다. |
| 선택 | 행을 누르면 오른쪽에 상세 패널이 열립니다. 선택은 이벤트 id로 새로 고침을 건너 이어지며, 그 행이 읽은 쪽에 없으면 풀립니다. 패널 머리의 가위표가 패널을 닫습니다. |
| 이벤트 복사 | 상세 패널 아래의 단추가 이벤트를 한 줄의 글로 복사합니다. 전체 시각, 갈래, 수준, 이름, 상태 전이 요약, 메시지, 그리고 발생 기록과 인터록이면 식별자가 함께 들어갑니다. 작업 기록 줄은 "이벤트를 클립보드에 복사했습니다."라고 답하고, 브라우저가 내주지 않았으면 "클립보드가 복사를 받지 않았습니다."라고 답합니다. |
| 내보내기 | 내보내기는 CSV로 내보내기…와 JSON으로 내보내기…가 든 메뉴를 열며, 검색과 필터와 기간에 맞는 모든 이벤트를 쪽마다 이어서 대상으로 삼습니다. 그려진 행만이 아닙니다. 그 쪽이 비어 있으면 단추가 흐려집니다. |
| 걸러지지 않은 기록 | 기록부은 누가 로그인해 있는지로도, 그 역할이 다른 곳에서 무엇을 볼 수 있는지로도 걸러지지 않습니다. 스테이션의 기술적 기록이며, 행 하나가 소리 없이 빠지면 이력이 거짓말을 하게 되기 때문입니다. |
목록과 상세 패널
행마다 지역화에서 정한 형식으로 적은 이벤트의 날짜와 시각, 수준의 색을 띤 점, 이벤트의 이름, 상태 전이의 한 줄 요약, 그리고 오른쪽 끝에 수준 자신의 낱말(우선순위, 심각도, 상태 전이)이 놓입니다. 색은 어느 화면에서나 같은 한 벌을 따릅니다. 심각 경보와 심각 발생 기록과 인터록 트립에는 위험을 나타내는 색, 높음과 경고와 "신호원 안전"에는 주의를 나타내는 색, 보통에는 눈길을 끄는 색, 나머지에는 중립색입니다.
상세 패널은 수준 배지와 이름으로 시작해 밀리초까지 적은 전체 시각, 상태 전이 요약, 메시지(정의에 메시지가 없었으면 "기록된 메시지가 없습니다."), 수준과 이벤트 ID가 든 이벤트 카드, 그리고 각 탭의 페이지가 열거하는 항목을 담은 스냅숏 카드 하나 이상을 차례로 보여 줍니다.
상태 줄
모든 시간선 아래에 놓입니다. "표시 N개 · 1페이지"이고 N은 열려 있는 쪽에 놓인 행의 수이며, 검색이나 수준 필터나 기간이 걸려 있으면 뒤에 " · 걸러짐"이 붙습니다. 다시 읽는 동안에는 "표시 N개 · 새로 고치는 중…"이 되고, 오른쪽에는 행을 고른 동안 "1개 선택됨"이, 그리고 마지막으로 성공한 읽기의 시각인 "hh:mm:ss에 갱신함"이 놓입니다.
읽는 중, 비어 있음, 실패 상태
| 상태 | 탭이 보여 주는 것 |
|---|---|
| 첫 읽기 | "경보 이벤트을(를) 읽는 중…"과 "영구 기록부에서 조건에 맞는 가장 최근 경보 이벤트을(를) 읽고 있습니다."(명사는 탭을 따릅니다). |
| 기록된 것이 없음 | "아직 경보 이벤트이(가) 없습니다"와 거기에 무엇이 나타날지 말하는 한 줄. 각 탭의 페이지가 자기 문장을 인용합니다. |
| 맞는 것이 없음 | "이 거르기에 맞는 경보 이벤트이(가) 없습니다"와 "우선순위이나 검색어를 조정하면 이 이력을 넓힐 수 있습니다."(탭에 따라 우선순위, 심각도, 상태 전이). |
| 기록부를 읽을 수 없음 | "경보을(를) 읽지 못했습니다"와 "영구 기록부를 잠시 쓸 수 없습니다. 콘솔 로그는 영향을 받지 않습니다.", 그리고 다시 시도 단추. 상태 줄은 "경보을(를) 쓸 수 없음"이라고 적습니다. |
| 나중의 새로 고침이 실패 | 마지막으로 잘 읽은 행이 화면에 그대로 남고, 작업 기록 줄이 "경보을(를) 새로 고치지 못했습니다."라고 알립니다. |
시간선 내보내기
두 형식 모두 브라우저 내려받기이므로 스테이션 자신의 창에서도, 원격 브라우저에서도 똑같이 됩니다. 작업 기록 줄은 "이벤트 N개를"에 이어 파일 이름과 "(으)로 내보냈습니다."를 붙여 답하거나 "내보내지 못했습니다."라고 답합니다. 파일 이름은 탭과 정렬 가능한 시각을 함께 담습니다. alarm-history-20260902-143000.csv, occurrence-history-<stamp>.json, interlock-history-<stamp>.csv처럼 됩니다.
모든 시각은 표시 형식 설정대로 적히며, 파일은 시간 기준을 한 번 선언합니다. CSV는 첫 열의 머리글에서 Timestamp (UTC-03:00)(또는 Timestamp (UTC))라고 이름 붙이고, JSON은 맨 위에 TimeZone 필드를 두고 그 옆에 Events 배열을 두는 봉투 구조입니다. 행에 보이는 것 말고도 열에는 얼어붙은 스냅숏 전체가 식별자까지 함께 실립니다(이벤트 id, 경보와 발생 기록과 관측의 id, 모델과 유닛의 id). 그래서 내보낸 시간선을 실행 파일이나 보고서와 맞춰 볼 수 있습니다. =, +, -, @로 시작하는 CSV 칸에는 작은따옴표를 앞에 붙여 스프레드시트가 수식이 아니라 글로 열게 합니다. 각 탭의 페이지가 자기 열을 열거합니다.
기록부이 지키는 것
세 시간선은 스테이션 데이터 폴더에서 config.db, history-index.db와 나란히 놓인 별도의 데이터베이스 events.db에 살며, 시간선마다 덧붙이기만 하는 표를 하나씩 씁니다. 기록되는 것은 이벤트가 일어난 그 순간에 찍은 스냅숏(이름, 우선순위, 메시지, 모델, 유닛, 신호원, 관측된 값)이므로, 나중에 정의의 이름을 바꾸거나 고치거나 지워도 그때 스테이션이 알려 준 내용은 다시 쓰이지 않습니다. 이 페이지에서도, 애플리케이션의 다른 어디에서도 행을 지우는 일은 없습니다. 보관 정책이 시간선마다 최신 100,000행을 지키며 덧붙일 때마다 기록된 순서로 가장 오래된 것을 덜어 내므로, 시계를 바로잡았다고 해서 갓 들어온 이벤트가 밀려나지 않습니다.
기록부은 재시작에도, 구성 복원에도 살아남습니다. 백업은 구성 데이터베이스와 자산 폴더만 복사하므로, 복원해도 기록부이 따라오지도 않고 되돌려지지도 않습니다. 기록부은 상태가 아니라 상태 전이의 기록입니다. 재시작한 뒤 경보 등록부는 첫 로직 주기에서 모든 경보를 다시 도출하고, 확인을 기다리던 것은 사라지며, 시간선은 그저 그 앞뒤에 무슨 일이 있었는지를 보여 줍니다.
이벤트는 런타임을 결코 막지 않는 순서 있는 대기열을 지나 기록부에 닿습니다. 만들어 낸 쪽이 곧바로 스냅숏을 찍고, 쓰는 쪽은 하나뿐이며 도착한 순서대로 커밋하고, 계속 실패하는 커밋은 열 번까지 다시 시도한 뒤 콘솔에 오류 한 줄을 남기고 그 이벤트를 버립니다. 실행 중에 관측된 발생 기록은 먼저 그 실행 자신의 파일에 쓰이고(이력과 보고서가 읽는 원본입니다) 그다음 같은 이벤트 id와 실행 맥락을 달고 기록부로 복사됩니다. "항상" 발생 기록이 실행 밖에서 한 관측은 기록부에만 갑니다. 인터록과 경보의 상태 전이는 기록부 말고는 어디에도 기록되지 않습니다. 로그 영역이 열린 에이전트는 event_history_read로 같은 기록부를 읽기 전용으로 읽습니다(허용 범위 참고).
기록 옆의 콘솔
콘솔은 세 시간선과 다른 것입니다. 프로그램의 진단 흐름을 500개까지 굴려 가며 메모리에 담아 보여 주는 것이라 재시작하면 사라지고 화면 비우기로도 비워집니다. 둘이 겹치는 자리는 런타임이 자기가 무엇을 하는지 이야기하는 대목입니다. 발생 기록의 변화 지점은 Process 영역에 콘솔 한 줄을 남기고(발생은 그 심각도에 맞는 수준으로, 심각은 오류로, 경고는 경고로, 정보는 정보로), 인터록의 상태 전이도 그렇습니다(트립은 경고로, 신호원 안전과 재설정은 정보로). 경보의 상태 전이는 콘솔에 나오지 않습니다. 평가기의 자취는 상세 수집만이 기록하는 진단용 세부 사항입니다. 시간선이 형식을 갖춘 기록이고, 콘솔은 그 둘레의 런타임을 설명합니다.
이벤트가 하지 않는 것
- 아무것도 구성하지 않습니다. 경보는 Logic > 경보에서, 발생 기록은 Process > 셋업 > 발생 기록에서, 정지 인터록은 Process > 정의 > 자동화에서 정의합니다.
- 인터록을 재설정하지 않습니다. 그것은 대시보드의 인터록 구성 요소나 유닛 자신의 화면이 하는 일입니다.
- 유닛 필터도, 실행 필터도 없습니다. 이름으로 검색하거나, 이력에서 그 실행을 열어 자기 발생 기록을 보십시오.
- 아무것도 지우지 않고 아무것도 고치지 않습니다. 행을 덜어 내는 것은 보관 정책뿐입니다.
- 런타임이 정지해 있는 동안에는 이 페이지가 아예 그려지지 않습니다. 계정을 뺀 모든 화면이 정지 알림으로 바뀌며 시간선도 마찬가지입니다. 기록부 자체는 그대로 남아 있어, 런타임을 다시 시작하면 있던 그대로 읽힙니다.