Skip to main content

Logs and Health

Logs come in three layers. You just need to know which layer to look at.

LayerWhatHow to view
Container logWhat the container sends to stdout — boot log + all service logs below with [태그] appendedHost bin/logs.sh plantpulse-datalake
Service logAbout 40 files that each module writes to its logs/Inside container pd logs [서비스]
Boot logpd start concatenates service launcher output into one file /var/log/plantpulse-datalake.logBOOT 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)
OptionMeaning
--listList files and exit immediately
--lines NShow the last N lines of each file before starting (default 10). With 0, show only what gets written from now on
--no-boot-logSkip 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:

TagFile (relative to PP_HOME)
BOOT/var/log/plantpulse-datalake.log
VALKEY/data1/pp-data/valkey/logs/system.log — under the data volume
POSTGRES · CASSANDRAplantpulse-storage/db/<엔진>/logs/system.log
KAFKA · MQTTplantpulse-messaging/kafka/logs/ · mqtt/logs/
CEP-TOMCAT · DGW-TOMCATplantpulse-cep/server/logs/catalina.<date>.log and others
TEMPORAL · KESTRAplantpulse-workflow/temporal/logs/ · kestra/logs/
ADMIN-APIplantpulse-datalake-admin-api/logs/admin-api.log

The exact list varies by box; trust pd logs --list.

Health — three checks answer different questions

CheckWhat it showsWhere
Container HEALTHCHECKWhether 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 statusWhether 21 ports are open. Given a service name, runs that service's health scriptInside container
/api/healthOverall 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 — 시크릿 값은 마스킹된다