Skip to content

Monitoring and logs

Frameleaf gives you everything you need to keep an eye on your server locally: logs, container health checks, job progress and version history. None of it is sent anywhere.

Telemetry is permanently turned off in Frameleaf. The server contains no OpenTelemetry code, exporters, metrics listener or usage collectors, and the bundled Compose files no longer start Prometheus or Grafana. The old IMMICH_TELEMETRY_INCLUDE, IMMICH_TELEMETRY_EXCLUDE and metrics port variables can’t turn reporting back on.

Update checks never contact an upstream service. When you turn them on, the server asks Frameleaf’s release feed whether there’s a newer version, and Frameleaf’s GitHub releases if the feed can’t answer.

What Where
Server health, storage, backups and what’s processing The Command Center overview. See Command Center
Job queues, failures and errors Settings, then Compute & jobs. See Jobs and queues
Machine learning and other workers Administration, then Processing destinations. See Workers and where jobs run
GPU set-up Settings, then Compute & jobs, then Hardware & GPU
Missing, unknown and changed files Administration, then Maintenance. See System integrity
Container health docker compose ps
Logs docker compose logs

From your Compose folder:

Terminal window
docker compose logs -f immich-server # the server
docker compose logs -f immich-machine-learning # machine learning
docker compose logs -f database # PostgreSQL

The service names work whatever the containers are called (frameleaf_server, frameleaf_machine_learning and so on).

Every service in the provided Compose file has a health check, and docker compose ps shows whether each one is healthy. The server’s check uses the frameleaf-healthcheck command in the server image, and the database image has its own check built in, including a check for data checksum failures.

Set how much the server logs in Administration, then Settings, then Logging: turn logging on or off and choose a level. You can also set it with FRAMELEAF_LOG_LEVEL in .env.

Level What’s logged
verbose Everything, including very detailed tracing
debug Detail useful when troubleshooting
log Normal activity (the default)
warn Warnings and errors only
error Errors only
fatal Only errors that stop the server

Raise the level while you troubleshoot, then set it back: verbose and debug produce a lot of output.

Frameleaf logs human-readable lines by default. To feed logs into your own log collector, switch to JSON with FRAMELEAF_LOG_FORMAT in .env and restart:

Terminal window
FRAMELEAF_LOG_FORMAT=json
Value Format
console Human-readable lines with colours (the default)
json One JSON object per line

Each JSON line looks like this:

{"level":"log","pid":36,"timestamp":1766533331507,"message":"Initialized websocket server","context":"WebsocketRepository"}
{"level":"warn","pid":48,"timestamp":1766533331629,"message":"Unable to open /build/www/index.html, skipping SSR.","context":"ApiService"}
Field Meaning
level Log level, such as log, warn or error
pid Process ID
timestamp Unix time in milliseconds
message The log message
context The part of the server that wrote it

Frameleaf never forwards logs itself; collecting them is up to your own tools.