# ratatouille
A zero-dependency Rust crate for best-effort telemetry firehose logging with topic filters, per-topic sequence counters, text or NDJSON formatting, and std-only HTTP/TCP sinks and relays.
## Features
- DEBUG-style allow/deny topic filters with `*` wildcards
- per-topic monotonic local sequence counters
- text and NDJSON output modes
- stdout sink, callback sink, and custom sink trait support
- plain `http://` sink plus bounded explicit-flush HTTP relay
- plain `tcp://host:port` sink plus bounded explicit-flush TCP relay
- zero external dependencies beyond Rust std
## Quick start
```rust
use ratatouille::{Format, Logger, LoggerConfig, SourceIdentity};
fn main() {
let mut config = LoggerConfig::default();
config.filter = Some("api*,-api:noise".into());
config.format = Format::Ndjson;
config.source = SourceIdentity {
app: Some("example".into()),
r#where: Some("rust".into()),
instance: Some("local".into()),
};
let mut logger = Logger::new(config);
let _ = logger.log("api", "hello from Rust");
}
```
## Transports
`HttpSink` and `HttpRelay` are intentionally minimal:
- `http://` only
- no TLS
- no background thread
- bounded in-memory relay queue
- explicit `flush_now()` for relay batch delivery
`TcpSink` and `TcpRelay` are similarly minimal:
- `tcp://host:port` only
- no background thread
- bounded in-memory relay queue
- explicit `flush_now()` for relay batch delivery
## Notes
- Logging is best-effort telemetry, not an audit trail.
- `LoggerConfig::default()` does not emit anything until a filter is configured.
- The shared behavioral contract lives in `contract/cases.tsv` in the repository root.