# slog-dtrace [![Latest Version]][crates.io] [![Documentation]][docs.rs] Forward `slog` messages as DTrace USDT probes. ## Overview Logging is invaluable in production applications. However, it presents a bit of a quandary. Most of the time, only informational or error messages are useful. But when an application crashes or is misbehaving, it can be extremely useful to retrieve more verbose logging information. Unfortunately, this can normally only be accomplished by restarting the process with a new log level. This crate allows applications to attach a `slog::Drain`, the `Dtrace` drain, to their loggers that forwards all messages to DTrace. This is done with a [`usdt`](https://docs.rs/usdt/latest) probe function, with different probes indicating different log levels. Note that the `Dtrace` drain will _only_ send messages to DTrace, but in most situations, one is already sending log messages to some location (stdout, file, syslog, etc.). The `with_drain` constructor can be used to generate a `Dtrace` drain that will forward messages to an existing drain as well as to DTrace. The DTrace probe that emits log messages is efficient. In particular, when the probe is disabled, it incurs no cost beyond that of any other drain(s) in the hierarchy. However, when the probe is enabled, every message, regardless of log-level, can be viewed in DTrace. ## Example ```bash $ cargo +nightly run --example simple ``` You can see that only warning messages are printed in the terminal. However, running a DTrace command in another shell should reveal more messages. ```bash # dtrace -Z -n 'slog*::: { printf("%s\n", copyinstr(arg0)); }' -q {"ok": {"location":{"module":"simple","file":"examples/simple.rs","line":15},"level":"WARN","timestamp":"2021-10-19T17:55:55.260393409Z","message":"a warning message for everyone","kv":{"cool":true,"key":"value"}}} {"ok": {"location":{"module":"simple","file":"examples/simple.rs","line":16},"level":"INFO","timestamp":"2021-10-19T17:55:55.260531762Z","message":"info is just for dtrace","kv":{"cool":true,"hello":"from dtrace","key":"value"}}} {"ok": {"location":{"module":"simple","file":"examples/simple.rs","line":17},"level":"DEBUG","timestamp":"2021-10-19T17:55:55.260579423Z","message":"only dtrace gets debug messages","kv":{"cool":true,"hello":"from dtrace","key":"value"}}} ``` We can see both the warning messages that the example's stdout prints, but also an info and debug message. There are specific probes for each logging level, allowing users to run DTrace actions in response to specific levels of messages. For example, this DTrace command receives just messages emitted via the `debug!` logging macro. ```bash # dtrace -Z -n 'slog*:::debug { printf("%s\n", copyinstr(arg0)); }' -q {"ok": {"location":{"module":"simple","file":"examples/simple.rs","line":17},"level":"DEBUG","timestamp":"2021-10-19T17:57:30.578681933Z","message":"only dtrace gets debug messages","kv":{"cool":true,"hello":"from dtrace","key":"value"}}} ``` ## Notes This crate inherits a reliance on a nightly toolchain from the `usdt` crate. [Latest Version]: https://img.shields.io/crates/v/slog-dtrace.svg [crates.io]: https://crates.io/crates/slog-dtrace [Documentation]: https://docs.rs/slog-dtrace/badge.svg [docs.rs]: https://docs.rs/slog-dtrace