Quick answer: Structured logs help triage but a chatty game can write 50MB/hr to a player's disk. A bounded ring buffer, log levels per subsystem, and async I/O cut the cost while keeping the signal.

Players in your Discord report you're filling their drives. The verbose log path you added 'just for now' has been on for nine months.

Bound the ring buffer

In-memory ring buffer at 4MB. Flush to disk only on crash or on a player-initiated bug report. Day-to-day disk write: zero.

Per-subsystem levels

Network logs at INFO, physics at WARN, render at ERROR by default. Power users flip the levels via console. Otherwise the disk-noisiest subsystem (network) dominates the file.

Async writes

Logger writes to a queue; a worker thread drains to disk. The render thread never blocks on file I/O. Especially important on consoles with slow storage.

Structured fields

log.info("player_died",
  player_id=id, cause=cause, position=pos)

Key-value at the call site. Lets your crash reporter parse them server-side; reads better than a printf string.

“Logging is a tool you use, not a thing you ship continuously running.”

If you can read a player's log file end-to-end and understand what happened, you over-logged. If you can't tell which level they were on, you under-logged. Tune toward the second.