Logs and Health
Logs come in three layers. You just need to know which layer to look at.
| Layer | What | How to view |
|---|---|---|
| Container log | What the container sends to stdout — boot log + all service logs below with [태그] appended | Host bin/logs.sh plantpulse-datalake |
| Service log | About 40 files that each module writes to its logs/ | Inside container pd logs [서비스] |
| Boot log | pd start concatenates service launcher output into one file /var/log/plantpulse-datalake.log | BOOT tag in pd logs, or tail |
From 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 one-shot output. To follow along, add -f. You view app container logs (server · batch · warehouse · HA · OPC-UA · AASX) with the same command — they are not in 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 | List files and exit immediately |
--lines N | Show the last N lines of each file before starting (default 10). With 0, show only what gets written from now on |
--no-boot-log | Skip the boot log |
서비스 … | Follow only these services |
pd logs follows only files declared by the service. If a file does not yet exist, it polls every 5 seconds and starts from the first line as soon as it appears. Some files are intentionally excluded — rotation copies, JVM GC logs, Cassandra 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 and others |
TEMPORAL · KESTRA | plantpulse-workflow/temporal/logs/ · kestra/logs/ |
ADMIN-API | plantpulse-datalake-admin-api/logs/admin-api.log |
The exact list varies by box; trust pd logs --list.
Health — three checks answer different questions
| Check | What it shows | Where |
|---|---|---|
| Container HEALTHCHECK | Whether postgres · cassandra respond to real queries + all ports of pd are open. Every 20 seconds, startup grace 900 seconds, unhealthy after 30 consecutive failures | (healthy) in docker ps |
pd status | Whether 21 ports are open. Given a service name, runs that service's health script | Inside container |
/api/health | Overall verdict from admin console backend (OK · WARN · FAIL) | https://<server-ip>:4950/api/health |
If docker ps is healthy but pd status shows STOPPED, you are in a startup window or missed once (run again for RUNNING). Conversely, if unhealthy but pd status are all RUNNING, ports are open but queries fail — check pd logs storage.
Kafka is special. Port 9092 opens 10 seconds before the broker handles requests, so pd checks "does the broker respond to ApiVersions requests at its advertised address" instead of the port. That is why the messaging health line shows 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 JSON line to plantpulse-datalake-admin-api/logs/pd-events.jsonl. The admin console Events screen 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 from the console are recorded by actor as operator:<name>. Unplanned shutdowns (service.down / service.recovered) are logged not by a person but by pd downtime.
Diagnostic bundle
To collect everything to attach to a support request, on the host:
cd /opt/kopens/plantpulse-platform-docker/bin
./ops-check.sh # 헬스 + 최근 critical 로그 + 제거된 워커의 잔여물
./doctor.sh # 진단 tarball — 시크릿 값은 마스킹된다
Related documentation
- System monitoring — readiness health check API for each web app
- Admin console — logs · events · diagnostics screens
- FAQ