Logging from a Rust Agent
Golem provides structured logging via the standard log crate. The SDK initializes the logger automatically when the agent starts — no setup code is needed.
Quick Start
The log crate is already in the project’s Cargo.toml (added by golem new). Use the standard macros:
log::trace!("detailed flow: entered process_item");
log::debug!("processing item id={}", item.id);
log::info!("order created: {}", order_id);
log::warn!("retry attempt {} for request {}", attempt, req_id);
log::error!("failed to connect to database: {}", err);Log Levels
| Macro | Use for |
|---|---|
log::trace! | Fine-grained control flow, variable values |
log::debug! | Debugging information |
log::info! | Monitoring, normal operations |
log::warn! | Hazardous situations, degraded behavior |
log::error! | Serious errors |
Structured Key-Value Logging
The log crate’s kv feature is enabled by default. Pass structured context as key-value pairs:
log::info!(agent_id = self.name, count = self.count; "counter incremented");
log::error!(operation = "db_query", table = "orders"; "query failed: {}", err);Key-value pairs appear before the ; separator.
Using println! / eprintln!
Standard output and error streams also work and are captured by Golem:
println!("stdout message"); // captured as stdout
eprintln!("stderr message"); // captured as stderrThese appear in golem agent stream output but lack log levels and context. Prefer log::* macros for structured, filterable logging.
Viewing Logs
Stream live agent output (stdout, stderr, and log channels):
golem agent stream '<agent-id>'Or during an invocation:
golem agent invoke '<agent-id>' '<method>' [args]
# Logs stream automatically; use --no-stream to suppressKey Points
- No initialization needed —
golem-rustinstalls the logger automatically during agent startup logcrate is pre-configured — it is already in the templateCargo.tomlwith thekvfeature- Logs are recorded in the oplog and visible via
golem agent streamandgolem agent invoke - Logging is a side effect — during replay (crash recovery), log calls from replayed operations are skipped; only new invocations produce log output
Last updated on