Skip to main content

Logs and Health

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

LayerWhat it isHow to view it
Container logsWhat the container outputs to stdout — boot logs plus everything from the service logs below with [태그] attachedHost bin/logs.sh plantpulse-datalake
Service logsRoughly 40 files that each module writes to its own logs/Inside the container pd logs [서비스]
Boot logsA single file /var/log/plantpulse-datalake.log where pd start concatenates the output of the service launcherThe 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)
OptionMeaning
--listLists files and exits immediately
--lines NShows N lines of existing content per file before starting (default 10). With 0, only shows what is written from now on
--no-boot-logExcludes 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:

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 etc.
TEMPORAL · KESTRAplantpulse-workflow/temporal/logs/ · kestra/logs/
ADMIN-APIplantpulse-datalake-admin-api/logs/admin-api.log

The exact list varies by box, so trust pd logs --list.

Health — three checks answer different questions​

CheckWhat it looks atWhere
Container HEALTHCHECKWhether 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 statusWhether 21 ports are open. If you give a service name, it runs that service's health scriptInside the container
/api/healthComprehensive verdict (OK · WARN · FAIL) collected by the admin console backendhttps://<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 — 시크릿 값은 마스킹된다