콘솔
실행 중인 프로그램의 실시간 진단 흐름입니다. 메모리에 담긴 항목 500개를 수준과 영역과 구성 요소로 검색하고 거르며, 문제 해결을 위한 상세 수집과 지원 패키지가 딸립니다.
이벤트의 콘솔 탭(/events?view=console)은 프로그램 전체의 진단 흐름입니다. 모든 하위 시스템(앱, 내장 OPC UA 서버, 드라이버, Logic, Process, 대시보드, 에이전트 접근, 라이선싱)이 하나의 흐름에 써 넣고, 콘솔은 그 가운데 가장 최근 항목 500개를 실시간으로 보여 줍니다. 형식을 갖춘 시간선을 다 읽은 다음에 마지막으로 읽는 기술적 세부 사항이기 때문에 마지막 탭입니다. 보려면 이벤트 보기가, 줄을 내보내거나 지원 패키지를 만들려면 이력 내보내기와 가져오기가, 상세 수집을 시작하거나 정지하려면 설정 변경이 필요합니다.
흐름과 그 버퍼
콘솔은 프로세스가 가진 하나뿐인 진단 흐름을 메모리에 담아 비춰 보여 주는 것입니다. 가장 최근 항목 500개이며, 그것을 보여 주는 모든 화면(스테이션 자신의 창, 모든 원격 브라우저, 모든 탭)이 같은 것을 나눠 봅니다. 새 항목이 들어오면 오래된 항목이 밀려나고, 이 탭의 어떤 것도 재시작을 넘겨 살아남지 않습니다. 같은 흐름은 스테이션 데이터 폴더의 날짜별 파일 logs\ganter-lab-<date>.log에도 쓰이며(30일치를 두고 파일 하나가 50 MB), 지원 패키지가 모으는 것이 바로 그 파일입니다.
모든 항목은 콘솔이나 파일에 닿기 전에 씻깁니다. URL 안의 비밀번호, 토큰, 키, 자격 증명은 "[REDACTED]"로, 프로토콜 페이로드(날 것의 바이트, JSON이나 XML 문서)는 "[PROTOCOL PAYLOAD OMITTED]"로 바뀌고, 메시지는 16 KB에서, 예외는 64 KB에서 "…[TRUNCATED]"를 달고 잘립니다. 흐름에 들어오는 것은 Information 이상 수준뿐입니다. 자세한 상세와, 만들어 낸 쪽이 진단용 세부 사항이라고 표시한 항목(날 것이고 되풀이되는 프로토콜 잡담)은 상세 수집 파일에만 닿습니다. 되풀이되는 통신 실패는 만들어 낸 쪽이 첫 실패 줄, 주기적 요약, 회복 줄로 묶어 주므로, 고장 난 장치 하나가 목록을 뒤덮지 않습니다.
항목 하나
행마다 시각, 수준을 나타내는 점(정보는 중립색, 경고는 주의를 나타내는 색, 오류는 위험을 나타내는 색), "영역 · 구성 요소", 그리고 메시지가 놓입니다. 행 오른쪽 끝의 줄 복사 단추는 "전체 시각 [심각도] 영역 · 구성 요소 메시지"를 복사하고 작업 기록 줄이 "줄을 클립보드에 복사했습니다."라고 답합니다(클립보드를 내주지 않는 브라우저에서는 "클립보드가 복사를 받지 않았습니다."). 행을 누르면 그 행이 선택되고 상세 패널이 열립니다.
검색
"메시지와 딸린 모든 문맥을 검색합니다"라는 입력란이 지연 없이 입력하는 대로 거릅니다. 메시지, 영역, 구성 요소, 로거, 장치, 태그, 작업, 클라이언트, 세션, 유닛, 절차, 실행 id, 상세 글(예외와 그 호출 스택) 가운데 어느 하나에라도 그 글이 대소문자 없이 들어 있으면 그 행이 걸립니다.
수준 칩
정보, 경고, 오류 세 칩이며, 저마다 수준의 색을 띤 점과 실시간 개수를 달고 켜고 끌 수 있습니다. 켜진 칩은 그 수준을 보여 주고, 누르면 그 수준을 감춥니다. 개수는 지금의 검색과 영역과 구성 요소 아래에서 그 칩이 드러낼 항목이 몇 개인지입니다. 그 세 가지 거르기는 따르되 수준 칩 자체는 따지지 않으므로, 감춘 수준도 자기가 무엇을 담고 있는지 계속 알립니다. 세 칩 모두 켜진 채로 시작합니다.
디버그 칩은 없습니다. Information보다 낮은 항목은 흐름에 아예 들어오지 않으므로, 그런 칩은 언제나 0을 가리키고 아무것도 감추지 못할 것입니다. 자세한 상세는 그 대신 상세 수집 파일에서 찾습니다.
영역 목록과 구성 요소 목록
| 목록 | 값 | 하는 일 |
|---|---|---|
| 영역 | 모든 영역(기본값), 그다음 하위 시스템마다 하나씩. App, Server, Connector, Logic, Process, Dashboard, Agent, Licensing | 하위 시스템 하나의 항목만 남깁니다. |
| 구성 요소 | 모든 구성 요소(기본값), 그다음 고른 영역에 대해 버퍼에 들어 있는 모든 구성 요소를 가나다순으로 | 영역 안에서 실제로 만들어 낸 쪽 하나(드라이버 하나, 작업자 하나, OPC UA SDK)의 항목만 남깁니다. |
| 영역 | 무엇이 거기에 쓰는가 |
|---|---|
| App | 애플리케이션의 수명 주기입니다. 데스크톱 호스트, 로깅, 충돌과 업데이트 처리, 이벤트 기록부 자신의 실패, 그리고 다른 영역을 대지 않은 모든 것입니다. |
| Server | 내장 OPC UA 서버와 그 SDK입니다. |
| Connector | 장치 통신입니다. 커넥터, 드라이버, 태그 읽기와 쓰기입니다. |
| Logic | 변수, 액션, 트리거, 경보, 그리고 쓰기 통로입니다. |
| Process | 모델, 레시피, 판정, 발생 기록, 인터록 감시기, 그리고 실행 수명 주기입니다. |
| Dashboard | 대시보드에서 누른 명령과, 대시보드를 내주는 내장 웹 호스트입니다. |
| Agent | AI 에이전트가 MCP로 한 일입니다. |
| Licensing | 스테이션의 라이선스와, 라이선스가 없을 때 런타임을 제한하는 장치입니다. |
고른 구성 요소는 그것을 달고 있던 항목이 버퍼에서 모두 밀려난 뒤에도 목록에 남습니다. 그래서 드라이버 하나를 지켜보려고 걸어 둔 거르기가 소리 없이 모든 구성 요소로 넓어지지 않으며, 그때 목록이 비는 것이 정직한 답입니다. 영역을 바꾸면 그 영역의 구성 요소 목록을 다시 만듭니다.
끝 따라가기
끝 따라가기 (자동 스크롤)가 켜져 있으면(기본값) 흐름이 자라는 대로 목록이 가장 새 항목에 붙어 갑니다. 위로 스크롤하면 꺼지므로 항목이 계속 들어오는 동안에도 무엇인가를 읽을 수 있고, 아래쪽 24픽셀 안으로 다시 스크롤하면 켜집니다. 꺼져 있는 동안에는 "새 항목 N개" 필이 지금의 거르기에 맞는 도착 건수를 셉니다. 그 필이나 도구 모음 단추를 누르면 끝으로 돌아갑니다. 다른 탭에 갔다가 돌아와도 따라가기 상태는 그대로이며, 켜져 있었으면 끝으로 뜁니다.
도구 모음
| 명령 | 하는 일 | 언제 흐려지는가 | 언제 그려지지 않는가 |
|---|---|---|---|
| 수집 시작 / 수집 정지 | 상세 진단 수집을 최대 15분 동안 시작하거나, 돌고 있는 것을 정지합니다(아래를 보십시오). | 전환이 적용되는 동안 | 역할에 설정 변경이 없을 때 |
| 창으로 열기 | 이벤트 페이지를 새 브라우저 탭이나 창에 엽니다. 스테이션 자신의 창에서도, 원격 브라우저에서도 되므로 두 번째 모니터에 흐름을 띄워 둘 수 있습니다. 새 창은 이 단추가 놓인 탭, 곧 콘솔 탭으로 열립니다. 팝업을 막는 브라우저에서는 아무것도 열리지 않고 작업 기록 줄이 그렇게 말합니다. "브라우저가 두 번째 창을 열지 않았습니다. 이 스테이션의 팝업을 허용한 뒤 다시 시도하십시오." | ||
| 자동 줄바꿈 | 긴 메시지를 잘라 내는 대신 여러 줄로 흘려 보여 줍니다. | ||
| 끝 따라가기 (자동 스크롤) | 따라가기를 켜거나(끝으로 뛰고 새 항목 수를 비웁니다) 끕니다. | ||
| 보기 지우기 | 메모리에 있는 흐름을 모든 화면에서 한꺼번에 비웁니다. 스테이션의 창, 모든 원격 브라우저, 모든 탭이 같은 빈 목록을 봅니다. 작업 기록 줄은 "스테이션 전체의 콘솔 보기를 지웠습니다."라고 답합니다. 날짜별 로그 파일과 수집 파일과 이벤트 기록부는 손대지 않습니다. | 런타임이 정지했을 때. 단추가 흐려지고 도구 설명이 스테이션이 지금은 아무 변경도 받지 않는다고 말합니다 | 역할에 설정 변경이 없을 때 |
| 내보내기 | 메뉴를 엽니다. CSV로 내보내기…, JSON으로 내보내기…, 그리고 구분선 아래에 지원 패키지 만들기…입니다. | 지원 패키지 만들기는 하나가 만들어지는 동안 흐려집니다 | 역할에 이력 내보내기와 가져오기가 없을 때 |
상세 수집
수집 시작은 프로세스 전체를 최대 15분 동안 자세한 로깅으로 올리고, 자세한 상세와 프로토콜 잡담까지 모두 자기 몫의 수집 파일에 씁니다. 스테이션 데이터 폴더의 logs\diagnostic-captures\ganter-temporary-diagnostic-<stamp>-<id>.log입니다(한 세션은 25 MB에서 넘어가며 파일 둘을 두고, 가장 최근 세션 열 개를 지킵니다). 500개짜리 흐름과 평소의 날짜별 파일은 있던 그대로입니다. 거기에는 아무것도 더 닿지 않습니다.
그러면 단추가 수집 정지로 읽힙니다. 도구 설명은 "상세 진단 수집을 예정보다 일찍 정지합니다. hh:mm:ss에 시작함."이라고 말합니다. 수집은 남은 시간이 0이 될 때, 단추를 누를 때, 앱이 종료될 때 스스로 멈춥니다. 시작과 끝 모두 작업 기록 줄에 알려지고("상세 수집을 최대 15분 동안 시작했습니다.", "상세 수집을 정지했습니다.") App · Diagnostic capture 아래에 콘솔 줄을 남깁니다.
수집은 스테이션 전체의 스위치입니다. 모든 회선이 같은 남은 시간을 보고, 그것을 누른 창보다 오래 삽니다. 그래서 설정 변경이 필요합니다. 그 권한이 없는 역할에는 단추가 그려지지 않고, 그래도 처리기에 눌림이 닿으면 "상세 수집을 시작하거나 정지하려면 설정 변경 권한이 필요합니다."라고 답합니다. 수집이 무엇을 하고 있는지는 어떤 권한에도 매이지 않습니다. 수집이 도는 동안 단추 옆의 읽기 표시가 녹화 점과 "상세 수집 중", 남은 시간(mm:ss, 15:00부터)을 함께 보여 주고, 어느 역할이나 그것을 읽습니다. 아무것도 수집하지 않을 때는 같은 읽기 표시가 화면 낭독기에만 남아 "상세 수집 안 함"으로 읽힙니다.
지원 패키지 만들기
내보내기 메뉴의 마지막 항목은 지원에 건넬 zip을 만들어 브라우저로 내려받습니다. 작업 기록 줄은 "지원 패키지를 만들었습니다:"에 이어 파일 이름(ganter-support-<stamp>-<id>.zip)을 답하거나, "지원 패키지를 만들지 못했습니다:"에 이어 이유를 답합니다. 다른 모든 내보내기와 마찬가지로 이력 내보내기와 가져오기가 필요합니다. 패키지는 이것을 담습니다.
| 항목 | 내용 |
|---|---|
recent-console.json |
메모리에 있는 흐름의 항목을 구조를 갖춘 기록으로 담습니다(걸러진 화면이 아니라 모든 항목의 모든 필드입니다). |
logs/ganter-lab-*.log |
평소의 날짜별 로그 파일입니다. |
diagnostic-captures/ganter-temporary-diagnostic-*.log |
상세 수집 파일입니다. |
manifest.json |
언제 만들어졌는지, 수집 상태(진행 중인지, 시작, 종료, 정지, 파일 이름), 흐름 항목을 몇 개 넣었는지, 한도, 넣은 파일과 그 크기 목록, 그리고 빠진 것 하나하나와 그 이유입니다. |
파일은 정해진 예산 안에서 새것부터 담습니다. 파일 8개까지, 파일 하나에 24 MB까지, 모두 합쳐 96 MB까지입니다. 자기 몫보다 큰 파일은 꼬리만(가장 새 바이트만) 넣고 그 사실을 manifest.json이 적습니다. zip은 시스템의 임시 폴더에서 만들어지고 내려받기가 끝나면 지워집니다.
상세 패널
항목을 고르면 심각도 배지, "영역 · 구성 요소", 그리고 닫기 가위표가 달린 패널이 열리고, 그다음에 이것이 놓입니다.
| 구역 | 항목 | 내용 |
|---|---|---|
| 머리 | 시각 | 밀리초까지 적은 전체 날짜와 시각입니다. |
| 머리 | 메시지 | 한 줄짜리 메시지입니다. |
| 문맥 | 영역 | 하위 시스템입니다. |
| 문맥 | 구성 요소 | 실제로 만들어 낸 쪽입니다. |
| 문맥 | 로거 | 항목 뒤에 있는 로거 갈래이며, 알 수 있을 때 보여 줍니다. |
| 문맥 | 수준 | Debug, Information, Warning, Error 가운데 하나입니다. |
| 문맥 | 장치, 태그, 작업, 클라이언트, 세션, 유닛, 절차, 실행 기록 | 항목이 지니고 있을 때만 각각 보여 줍니다. 커넥터 줄이 가리키는 장치와 태그, 진단 대상이 된 작업(읽기, 쓰기, 접속), OPC나 프로토콜의 클라이언트와 세션, 그리고 Process의 유닛과 절차와 실행 id입니다. |
| 세부 정보 | 항목이 지니고 있었을 때의 예외 글과 호출 스택입니다. |
아래쪽의 항목 복사는 패널 전체를 글로 복사하고(머리 줄, 메시지, 문맥 항목마다 "이름: 값" 한 줄, 그다음 상세 덩어리) "항목을 클립보드에 복사했습니다."라고 답합니다. 항목이 버퍼에서 밀려나면 선택이 풀리고, 보기 지우기도 선택을 비웁니다.
내보내기
CSV로 내보내기…와 JSON으로 내보내기…는 지금 보이는 줄(걸러진 화면)을 app-logs-<yyyyMMdd-HHmmss>.csv나 .json이라는 이름의 브라우저 내려받기로 씁니다. 작업 기록 줄은 "N개 줄을"에 이어 파일 이름과 "(으)로 내보냈습니다."를 붙여 답합니다. 둘 다 같은 열을 이 순서로 싣습니다. Timestamp(CSV에서는 머리글이 Timestamp (UTC-03:00)이며 시간 기준을 한 번 선언합니다), Severity, Area, Component, Logger, Device, Tag, Operation, Client, Session, Unit, Procedure, RunId, Message, Exception입니다. JSON은 { "TimeZone": "...", "Entries": [ ... ] } 모양의 봉투입니다. =, +, -, @로 시작하는 CSV 칸에는 작은따옴표를 앞에 붙여 스프레드시트가 글로 읽게 합니다.
상태 줄
"표시 N개 · 버퍼 N개"이고, 검색이나 영역이나 구성 요소나 수준 거르기가 걸려 있으면 " · 걸러짐"이 붙습니다. 오른쪽에는 항목을 고른 동안 "1개 선택됨"이, 그리고 마지막으로 도착한 항목의 시각인 "hh:mm:ss에 갱신함"이 놓입니다. 맞는 것이 없으면 목록은 "지금 거르기에 맞는 항목이 없습니다. 수준, 영역, 구성 요소나 검색어를 조정하면 더 볼 수 있습니다."라고 적습니다.
콘솔이 하지 않는 것
- 기록이 아닙니다. 메모리에 항목 500개를 담고, 재시작하면 잃고, 보기 지우기는 모두에게서 비웁니다. 남는 기록은 세 시간선이고, 디스크에서는 날짜별 로그 파일입니다.
- Information보다 낮은 것은 보여 주지 않고, 프로토콜 상세는 결코 보여 주지 않습니다. 그것이 상세 수집이 있는 이유입니다.
- 보기 지우기는 파일도 기록부의 행도 지우지 않고, 런타임이 정지해 있으면 거부되며, 옆의 내보내기나 수집 시작과 마찬가지로 설정을 바꿀 수 있는 역할에만 그려집니다.
- 상세 수집은 15분보다 길게 늘일 수 없습니다. 하나를 더 시작하십시오.
- 내보내기는 보이는 것을 쓸 뿐 디스크의 파일을 쓰지 않습니다. 파일이 스테이션을 떠나는 길은 지원 패키지입니다.
- 로그 영역이 열린 에이전트는
logs_read로 같은 흐름을 읽습니다(도구 참고). 흐름을 비울 수는 없습니다.