Why Velo?
Lightning fast
Outperforms zap by 22% with zero-allocation field logging. Asynchronous I/O keeps your application fast under heavy load.
Developer friendly
Clean API with both loosely typed key-value pairs and strongly typed fields. Beautiful colorized output for local development.
Production ready
JSON output, structured fields, and configurable overflow strategies. Control backpressure with sync, drop, or block modes.
Zero dependencies
Minimal footprint with no external logging dependencies. Drop-in replacement for Go’s standard slog handler.
Performance
Velo uses a hybrid synchronous and asynchronous model to keep your application fast under heavy load. When you log a message, Velo formats it on the caller’s goroutine and sends it to a buffered channel. A background worker reads from this channel and writes to the output stream. This parallelizes the work and isolates your application code from I/O latency.Benchmarks
Logging a message with 10 fields:| Package | Time | vs zap | Allocations |
|---|---|---|---|
| velo (fields) | 513 ns/op | -22% | 1 allocs/op |
| velo | 591 ns/op | -10% | 6 allocs/op |
| zap | 656 ns/op | +0% | 5 allocs/op |
| zap (sugared) | 856 ns/op | +30% | 10 allocs/op |
| zerolog | 2144 ns/op | +227% | 38 allocs/op |
| slog | 2700 ns/op | +312% | 41 allocs/op |
Backpressure handling
In high throughput scenarios, your application might generate logs faster than the output stream can write them. When the buffer is full, backpressure occurs. You can control how Velo handles a full buffer using theOverflowStrategy option:
OverflowSync (Default)
OverflowSync (Default)
The logger temporarily switches to a synchronous write. The calling goroutine writes its preformatted log entry directly to the output stream. This prevents log loss and controls memory use, but temporarily blocks the calling goroutine.
OverflowDrop
OverflowDrop
The logger discards new log entries until space opens up in the buffer. Use this strategy when maintaining low latency is more critical than keeping every log entry.
OverflowBlock
OverflowBlock
The calling goroutine waits and blocks until space becomes available in the buffer.
Next steps
Installation
Get started by installing Velo in your Go project
Quick start
Learn the basics with working code examples