tracing-rfc-5424
================
# Introduction
[tracing-rfc-5424](https://github.com/sp1ff/syslog-tracing/tracing-rfc-5424) is a [tracing-subscriber](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/index.html) [Layer](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/layer/trait.Layer.html) implementation that sends [tracing](https://docs.rs/tracing/latest/tracing/index.html)[Event](https://docs.rs/tracing/latest/tracing/struct.Event.html)s to a [syslog](https://en.wikipedia.org/wiki/Syslog) [daemon](https://en.wikipedia.org/wiki/Daemon_(computing)).
[tracing](https://docs.rs/tracing/latest/tracing/index.html) is a "scoped, structured logging and diagnostics system". It provides a superset of the features offered by logging crates such as [fern](https://docs.rs/fern/latest/fern/index.html) and [log4rs](https://docs.rs/log4rs/latest/log4rs/) particularly suited to asynchronous programming. Of particular interest is that it makes a very clear distinction between producers of events & their consumers ([Subscriber](https://docs.rs/tracing/0.1.34/tracing/trait.Subscriber.html)s, in [tracing](https://docs.rs/tracing/latest/tracing/index.html) parlance); so much so that the [tracing](https://docs.rs/tracing/latest/tracing/index.html) crate provides no support for consuming events, other than the definition of the [Subscriber](https://docs.rs/tracing/0.1.34/tracing/trait.Subscriber.html) trait.
The [tracing-subscriber](https://docs.rs/tracing-subscriber/0.3.11/tracing_subscriber/index.html) crate (also part of the [Tokio](https://tokio.rs/) project) provides a few basic implementations along with "utilities for implementing and composing tracing subscribers." A key notion introduced by this crate is the idea of a [Layer](https://docs.rs/tracing-subscriber/0.3.11/tracing_subscriber/layer/trait.Layer.html). "Unlike Subscribers, which implement a complete strategy for how trace data is collected, Layers provide modular implementations of specific behaviors." The concern here is that, in general, a consumer of [tracing](https://docs.rs/tracing/latest/tracing/index.html) event data may want to do various things at the same time with that data: write it to a log file, just write it to `stdout`, shuttle it off to a log collection daemon, produce metrics based on it, and so on.
This could easily give rise to a geometric explosion in types: `LogFile`, `LogFileWithStdout`, `LogFileWithLogStash`, `LogFileWithLogStashAndStdout`, and so forth. The idea behind [Layer](https://docs.rs/tracing-subscriber/0.3.11/tracing_subscriber/layer/trait.Layer.html)s is to decompose each facet of event handling into its own type, and then "stack them up" in a [Subscriber](https://docs.rs/tracing/0.1.34/tracing/trait.Subscriber.html) as the application developer desires. In a sense, this design pattern is reminiscent of [Alexandrescu](https://en.wikipedia.org/wiki/Andrei_Alexandrescu)'s concept of [traits classes](https://erdani.com/publications/traits.html) in C++– a way of decomposing functionality into orthogonal facets and composing them linearly rather than geometrically.
[tracing-rfc-5424](https://github.com/sp1ff/syslog-tracing/tracing-rfc-5424) is a [Layer](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/layer/trait.Layer.html) implementation that sends [Event](https://docs.rs/tracing/latest/tracing/struct.Event.html)s (and, soon, [Span](https://docs.rs/tracing/latest/tracing/struct.Span.html)s) to a syslog daemon. Both RFCs [3164](https://www.rfc-editor.org/rfc/rfc3164) (BSD syslog) and [5424](https://www.rfc-editor.org/rfc/rfc5424.html) are supported. Internet & Unix domain sockets are supported for transport, both in their datagram & stream flavors.
# License
This crate is released under the [GPL 3.0](https://spdx.org/licenses/GPL-3.0-or-later.html).
# Prerequisites
Other than [tracing](https://github.com/tokio-rs/tracing) and a syslog daemon, none. [tracing-rfc-5424](https://github.com/sp1ff/syslog-tracing/tracing-rfc-5424) was developed against rust 1.58.1, although [tracing](https://github.com/tokio-rs/tracing) requires 1.49.
# Installation
To add [tracing-rfc-5424](https://github.com/sp1ff/syslog-tracing/tracing-rfc-5424) to your crate, just say `cargo add tracing-rfc-5424`, or add it directly to your `Cargo.toml`:
[dependencies]
tracing-rfc-5424 = "0.1.2"
# Usage
To talk to a local syslog daemon over UDP:
use tracing::info;
use tracing_rfc_5424::{
layer::Layer, rfc5424::Rfc5424, tracing::TrivialTracingFormatter, transport::UdpTransport,
};
use tracing_subscriber::{
layer::SubscriberExt, // Needed to get `with()`
registry::Registry,
};
// Setup the subsriber...
let subscriber = Registry::default()
.with(Layer::::try_default().unwrap());
// and install it.
let _guard = tracing::subscriber::set_default(subscriber);
info!("Hello, world!");
// Will produce a syslog line something like:
// Jun 23 16:10:55 my-host my-app[pid] Hello, world!
To talk to a local Unix socket:
use tracing::info;
use tracing_rfc_5424::{rfc3164::Rfc3164, tracing::TrivialTracingFormatter, transport::UnixSocket};
use tracing_subscriber::{
layer::SubscriberExt, // Needed to get `with()`
registry::Registry,
};
// Setup the subsriber...
let subscriber = subscriber
.with(tracing_rfc_5424::layer::Layer::::try_default().unwrap());
// and install it.
let _guard = tracing::subscriber::set_default(subscriber);
info!("Hello, world!");
# Status, Rationale and Roadmap
This is a preliminary release; the version number (0.1.x) is intended to convey that. See this crate's parent [workspace](https://github.com/sp1ff/syslog-tracing) for more on the roadmap.
Bugs, comments, problems, criticism, PRs, feature requests &c welcome at [sp1ff@pobox.com](mailto:sp1ff@pobox.com) and in the [issues](https://github.com/sp1ff/syslog-tracing/issues).