Operations · 04 · Windows Windows only

Logs (Windows)

Where Halton Meter logs to on Windows, log rotation (100 MiB / 5 backups since v0.2.9), and how to tail the daemon during a live capture session.

macOS 12+ · Python 3.11+ Reading time 2 min Updated May 11, 2026

Halton Meter logs to plain files under %USERPROFILE%\.halton-meter\, one pair per Task Scheduler task (stdout + stderr). The daemon and edge use structlog with ISO-8601 UTC timestamps and dotted lowercase event names — same convention as macOS and Linux.

No log goes to the Windows Event Log; no log leaves the machine.

On-disk layout

FileProcessSource
%USERPROFILE%\.halton-meter\daemon.out.logdaemonstdout
%USERPROFILE%\.halton-meter\daemon.err.logdaemonstructlog stderr
%USERPROFILE%\.halton-meter\edge.out.logedgestdout
%USERPROFILE%\.halton-meter\edge.err.logedgestructlog stderr

There is no watchdog process on Windows in phase 0 — Task Scheduler’s ONLOGON trigger is the supervisor. So no watchdog.*.log either. There is no userenv.*.log because env-var propagation happens inline during init (via HKCU\Environment + WM_SETTINGCHANGE).

The .err.log files are the interesting ones — that’s where structured events land. The .out.log files are mostly empty.

Rotation (v0.2.9+)

Daemon logs rotate at 100 MiB with 5 backups (RotatingFileHandler). When daemon.err.log reaches 100 MiB, it’s renamed to daemon.err.log.1, the previous .1 becomes .2, and so on. After 5 backups the oldest is deleted. Same applies to daemon.out.log, edge.err.log, edge.out.log.

Total worst-case footprint per stream: 100 MiB × 6 = 600 MiB. With both daemon and edge: 1.2 GiB. Plenty of room for forensic work without runaway disk usage.

Tailing live

PowerShell’s Get-Content -Wait -Tail is the equivalent of tail -F:

PS — tail every component
PS> Get-Content -Wait -Tail 50 $env:USERPROFILE\.halton-meter\daemon.err.log
PS> Get-Content -Wait -Tail 50 $env:USERPROFILE\.halton-meter\edge.err.log

Run each in its own Windows Terminal tab so you can read both streams during a live capture session.

Event-name convention

Same as macOS and Linux — see the Logs page for the full list and grep recipes. Useful Windows-specific events emitted from daemon/halton_meter/system_proxy/_windows.py:

EventMeaning
system_proxy.windows_apps_mode.enabledApps-mode proxy + cert + env successfully applied during init
system_proxy.windows_apps_mode.enable_failedinit could not finish applying the proxy / env / cert; details in same row
system_proxy.windows_apps_mode.disableduninstall cleared the registry / env / tasks
system_proxy.windows_apps_mode.proxy_resethalton-meter reset-proxy restored the prior registry state
system_proxy.windows.broadcast_failedWM_SETTINGCHANGE SendMessageTimeoutW returned an error code
system_proxy.windows.registry_write_failedHKCU Internet Settings write failed (Group Policy, ACL, or wrong hive)
system_proxy.windows.snapshot_failedCould not write system_state.json snapshot
system_proxy.windows.restore_faileduninstall could not restore the prior snapshot
system_proxy.windows.setenv_failedHKCU\Environment write or broadcast failed
system_proxy.windows.unsetenv_faileduninstall could not remove an env var from HKCU\Environment
cloud.worker.sync_pausedSync paused; paused_reason in the same row
addon.body_capture.skipBody capture skipped (> 4 MiB; v0.2.10)

The grep pattern system_proxy.windows matches every Windows-specific proxy event in one shot.

Quick recipes

PS — common log queries
# Did init's Windows apps-mode step succeed (or fail loudly)?
PS> Select-String -Path $env:USERPROFILE\.halton-meter\daemon.err.log -Pattern "system_proxy.windows_apps_mode"

# Every Windows-specific proxy event in the last 100 lines
PS> Get-Content $env:USERPROFILE\.halton-meter\daemon.err.log -Tail 100 | Select-String "system_proxy.windows"

# How many request bodies were skipped for being too large?
PS> (Select-String -Path $env:USERPROFILE\.halton-meter\daemon.out.log -Pattern "body_capture.skip").Count

# Last cloud sync result
PS> Select-String -Path $env:USERPROFILE\.halton-meter\daemon.err.log -Pattern "cloud.worker" | Select-Object -Last 5

# Loopback bind guard fired?
PS> Select-String -Path $env:USERPROFILE\.halton-meter\daemon.err.log -Pattern "loopback"

See also