Skip to content

Logging and debugging ​

GoAPTCacher writes structured-prefix text logs to standard output. Under systemd, inspect them with journalctl; in containers, use the runtime log command.

Routine logging ​

bash
sudo journalctl -u goaptcacher -f
docker logs --follow goaptcacher

Common prefixes include:

PrefixMeaning
[INFO:GET:HIT]Object served from local cache
[INFO:DL:CREATED]Cache miss completed and stored
[INFO:TUNNEL]End-to-end tunnel activity
[INFO:REFRESH:*]Conditional metadata or object refresh
[INFO:EXPIRE]Retention scan and deletion activity
[INFO:403]Host denied by policy or HTTPS blocked
[ERROR:GET:*]Origin, disk, or cache-miss failure
[DEBREPOCLEANER-*]Repository verification result

Under systemd, timestamp and source-file flags are omitted because the journal already supplies metadata. Direct process execution includes standard timestamps and short source locations.

Periodic runtime metrics ​

Enable debug logging:

yaml
debug:
  enable: true
  allow_remote: false
  log_interval_seconds: 60

A memory/runtime line is written immediately and at the selected interval. It includes goroutine count, heap state, total Go runtime memory, garbage-collection count, and accumulated GC pause time.

Set a reasonable interval; very small values create unnecessary log volume. Restart the process after configuration changes.

Debug JSON ​

With debug.enable: true:

bash
curl -s http://127.0.0.1:8090/_goaptcacher/debug | jq

The response contains build information, Go version, goroutine and GOMAXPROCS values, pprof settings, and detailed memory counters.

When allow_remote: false, only requests whose TCP source address is loopback are accepted. A request forwarded by a reverse proxy normally appears to come from the proxy address and may therefore be rejected unless the reverse proxy itself connects over loopback.

Live pprof endpoints ​

GoAPTCacher exposes the standard Go profiles below:

text
/_goaptcacher/debug/pprof/
/_goaptcacher/debug/pprof/heap
/_goaptcacher/debug/pprof/goroutine
/_goaptcacher/debug/pprof/profile
/_goaptcacher/debug/pprof/trace
/_goaptcacher/debug/pprof/cmdline
/_goaptcacher/debug/pprof/symbol

Example CPU capture from the same host:

bash
go tool pprof \
  http://127.0.0.1:8090/_goaptcacher/debug/pprof/profile?seconds=30

Live pprof routes are available whenever debug mode is enabled; debug.pprof.enable controls periodic files, not the HTTP handler.

Do not expose pprof publicly

Profiles can reveal request patterns, paths, memory contents, and operational details. Keep allow_remote: false and use local access or a protected tunnel.

Periodic profile files ​

yaml
debug:
  enable: true
  allow_remote: false
  pprof:
    enable: true
    directory: "/var/cache/goaptcacher/pprof"
    interval_seconds: 300
    retain: 48

Each interval writes one heap profile and one goroutine profile with a UTC timestamp. Files are first written with .tmp and atomically renamed. The current retention cleanup counts individual .pprof files, so retain: 48 keeps approximately 24 two-file capture rounds. 0 keeps all files.

When no directory is configured, the default is <cache_directory>/pprof. Monitor its size, especially when retention is disabled.

Useful captures ​

bash
curl -s http://127.0.0.1:8090/_goaptcacher/debug > debug.json
sudo journalctl -u goaptcacher --since '-30 min' > goaptcacher.log
goaptcacher --version

Before sharing logs or profiles, review them for internal hostnames, repository paths, addresses, and sensitive traffic metadata.

Released under the MIT License.