Logs and Health
Logs come in three layers. You just need to know which layer to look at.
| Layer | What it is | How to view it |
|---|---|---|
| Container logs | What the container outputs to stdout — boot logs plus everything from the service logs below with [태그] attached | Host bin/logs.sh plantpulse-datalake |
| Service logs | Roughly 40 files that each module writes to its own logs/ | Inside the container pd logs [서비스] |
| Boot logs | A single file /var/log/plantpulse-datalake.log where pd start concatenates the output of the service launcher | The BOOT tag in pd logs, or tail |
On the host — logs.sh
cd /opt/kopens/plantpulse-platform-docker/bin
./logs.sh # 모든 컨테이너의 마지막 200줄, 1회 출력
./logs.sh plantpulse-datalake # 데이터레이크 컨테이너만
./logs.sh -f plantpulse-datalake # 계속 따라간다 (Ctrl+C)
./logs.sh --list # 서비스 · 컴포넌트 이름 목록
./logs.sh cassandra # 컴포넌트 이름을 주면 데이터레이크 안 그 로그 파일
As of 2026-09-02, the default is a single output. To follow along, append -f. You can also view logs for app containers (server · batch · warehouse · HA · OPC-UA · AASX) with the same command — those are not under pd logs.
Inside the container — pd logs
docker exec plantpulse-datalake pd logs --list # 따라갈 파일 <태그> <path> 목록만
docker exec plantpulse-datalake pd logs --lines 50 cep # cep 만, 마지막 50줄부터
docker exec plantpulse-datalake pd logs --lines 3 admin-api
docker exec -it plantpulse-datalake pd logs storage messaging # 여러 서비스, 계속 따라감 (Ctrl+C)
| Option | Meaning |
|---|---|
--list | Lists files and exits immediately |
--lines N | Shows N lines of existing content per file before starting (default 10). With 0, only shows what is written from now on |
--no-boot-log | Excludes boot logs |
서비스 … | Only these services |
pd logs only follows files that the service declares. If a file does not exist yet, it rechecks every 5 seconds and follows from the first line as soon as it appears. Some things are intentionally not followed — rotation copies, JVM GC logs, Aster TSDB debug.log (use pd node errors instead), HiveMQ event.log (message-level audit, tens of MB), Kafka request audit logs.
Commonly viewed tags and files:
| Tag | File (relative to PP_HOME) |
|---|---|
BOOT | /var/log/plantpulse-datalake.log |
VALKEY | /data1/pp-data/valkey/logs/system.log — under the data volume |
POSTGRES · CASSANDRA | plantpulse-storage/db/<엔진>/logs/system.log |
KAFKA · MQTT | plantpulse-messaging/kafka/logs/ · mqtt/logs/ |
CEP-TOMCAT · DGW-TOMCAT | plantpulse-cep/server/logs/catalina.<date>.log etc. |
TEMPORAL · KESTRA | plantpulse-workflow/temporal/logs/ · kestra/logs/ |
ADMIN-API | plantpulse-datalake-admin-api/logs/admin-api.log |
The exact list varies by box, so trust pd logs --list.
Health — three checks answer different questions
| Check | What it looks at | Where |
|---|---|---|
| Container HEALTHCHECK | Whether postgres · cassandra actually answer queries + whether all ports in pd are open. Every 20 seconds, 900-second startup grace, unhealthy after 30 consecutive failures | (healthy) in docker ps |
pd status | Whether 21 ports are open. If you give a service name, it runs that service's health script | Inside the container |
/api/health | Comprehensive verdict (OK · WARN · FAIL) collected by the admin console backend | https://<server-ip>:4950/api/health |
If docker ps is healthy but pd status shows STOPPED, that's either a startup window or a one-off miss (it will go back to RUNNING). Conversely, if it's unhealthy but pd status shows all RUNNING, the ports are open but queries are not being answered — pd logs storage.
Kafka is special. Port 9092 opens 10 seconds before the broker can handle requests, so pd checks "does the broker respond to an ApiVersions request sent to its advertised address" instead of checking the port. That's why the messaging health line includes a reason like UP (advertised 10.99.0.100:9092 answered ApiVersions).
docker inspect --format '{{json .State.Health.Log}}' plantpulse-datalake | jq # 최근 헬스체크 결과
docker exec plantpulse-datalake pd status messaging # 서비스 하나의 헬스 줄
Event journal — who did what and when
pd start · stop · restart · backup each write one line of JSON to plantpulse-datalake-admin-api/logs/pd-events.jsonl. The Events screen in the admin console shows this as a timeline.
{"at":"2026-09-03T10:11:53+09:00","kind":"service.stop","subject":"datalake","severity":"info","message":"pd stop","actor":"pd","exit_code":0}
Commands run in the console are logged by actor as operator:<name>. Unplanned stops (service.down / service.recovered) are not recorded by a person, but by the log of pd downtime.
Diagnostic bundle
To gather everything to attach to a failure inquiry, on the host:
cd /opt/kopens/plantpulse-platform-docker/bin
./ops-check.sh # 헬스 + 최근 critical 로그 + 제거된 워커의 잔여물
./doctor.sh # 진단 tarball — 시크릿 값은 마스킹된다
Related documents
- System Monitoring — readiness health check API for each web app
- Admin Console — logs · events · diagnostics screens
- FAQ