Skip to main content
Version: v3.8.0

Edgelet logging

Structured lifecycle logging for Process Manager, container engines, and EdgeletAPI. Events are written as top-level JSON fields in Edgelet daemon logs.

Field schema

FieldDescription
timestampLog time
leveldebug / info / warn / error
moduleLogger module name (e.g. Container Manager, Edgelet API Handler)
messageShort human-readable summary
eventStable event name (see catalog below)
operationIdCorrelation UUID for one deploy/update/remove
enginedocker, podman, or edgelet
msUUIDMicroservice UUID
containerIdRuntime container ID
sandboxIdCRI pod sandbox ID (edgelet engine)
imageImage reference used
phaseSub-phase: pull, create, start, stop, remove
resultok, failed, skipped
durationMsPhase duration in milliseconds
reasonCodeStable failure/drift code for alerting
sourcetask, reconcile, shutdown, runtime_watch, api, watchdog
errorTruncated error text (max 512 chars)

Never logged: registry passwords, env values, JWT/bearer tokens.

EdgeletAPI access logs

EventWhen
edgeletapi.accessAuthorized request (method, path, status, duration)
edgeletapi.rejectAuth or RBAC rejection
edgeletapi.debugVerbose handler diagnostics (LOG_LEVEL=debug)

Process Manager event catalog

EventWhen
pm.started / pm.stoppedProcess Manager lifecycle
task.enqueued / task.started / task.completed / task.failed / task.retryTask queue
reconcile.cycle / reconcile.decisionMonitor tick
container.pullingcontainer.removedContainer lifecycle phases
container.runtime.eventExternal runtime signal (source=runtime_watch)
shutdown.drainGraceful shutdown

Log levels

LevelUse
infoProduction default
warnDegraded but continuing
errorOperation failed
debugReconcile internals, CRI substeps, EdgeletAPI handler detail

Set via config logLevel or environment (LOG_LEVEL=info). See Configuration reference.

Log files (rotated)

When logDirectory is configured (default /var/log/edgelet/):

systemd unitBasenameActive file
edgelet.serviceedgeletedgelet.0.log
edgelet-containerd.serviceedgelet-containerdedgelet-containerd.0.log

Runtime split (embedded engine): edgelet gets 60% of logLimit, edgelet-containerd gets 40%.

Hot reload: logLevel, logLimit, and logFileCount apply on config reload without rotating the active file. Control plane reloads via SIGHUP / edgelet system reload. Changing logDirectory requires a process restart.

Microservice logs under logDirectory/containers/ use separate per-UUID series.

journald

sudo journalctl -u edgelet -f
sudo journalctl -u edgelet-containerd -f
sudo journalctl -u edgelet --since "30 min ago" | jq -r 'select(.event!=null) | .event'

Example queries

Failed tasks (Loki-style):

{job="edgelet"} | json | event="task.failed"

Correlate one deploy operation:

{job="edgelet"} | json | operationId="<OPERATION_ID>"

EdgeletAPI rejections:

{job="edgelet"} | json | event="edgeletapi.reject"

Reason codes

CodeMeaning
PULL_FAILEDRegistry pull failed
CREATE_FAILEDContainer create failed
START_FAILEDContainer start failed
NON_RESTARTABLE_EXITTerminal CRI exit; recreate required
RUNTIME_DRIFTStale DB vs runtime
TASK_EXHAUSTED_RETRIESTask failed 5 times

See also

Group 3See anything wrong with the document? Help us improve it!