rgen_utils/
logger.rs

1use slog::o;
2use slog::Drain;
3#[cfg(all(target_os = "linux", feature = "journald"))]
4use slog_journald::JournaldDrain;
5#[cfg(feature = "syslog")]
6use slog_syslog::Facility;
7
8use super::error::Result;
9
10pub fn setup_logging() -> Result<slog_scope::GlobalLoggerGuard> {
11    // Setup Logging
12    let guard = slog_scope::set_global_logger(default_root_logger()?);
13    slog_stdlog::init()?;
14
15    Ok(guard)
16}
17
18pub fn default_root_logger() -> Result<slog::Logger> {
19    // Create drains
20    let drain = slog::Duplicate(default_discard()?, default_discard()?).fuse();
21
22    // Merge drains
23    #[cfg(feature = "termlog")]
24    let drain = slog::Duplicate(default_term_drain().unwrap_or(default_discard()?), drain).fuse();
25    #[cfg(feature = "syslog")]
26    let drain = slog::Duplicate(default_syslog_drain().unwrap_or(default_discard()?), drain).fuse();
27    #[cfg(feature = "journald")]
28    #[cfg(target_os = "linux")]
29    let drain = slog::Duplicate(
30        default_journald_drain().unwrap_or(default_discard()?),
31        drain,
32    )
33    .fuse();
34
35    // Create Logger
36    let logger = slog::Logger::root(drain, o!("who" => "rust-starter"));
37
38    // Return Logger
39    Ok(logger)
40}
41
42fn default_discard() -> Result<slog_async::Async> {
43    let drain = slog_async::Async::default(slog::Discard);
44
45    Ok(drain)
46}
47
48// term drain: Log to Terminal
49#[cfg(feature = "termlog")]
50fn default_term_drain() -> Result<slog_async::Async> {
51    let plain = slog_term::PlainSyncDecorator::new(std::io::stdout());
52    let term = slog_term::FullFormat::new(plain);
53
54    let drain = slog_async::Async::default(term.build().fuse());
55
56    Ok(drain)
57}
58
59// syslog drain: Log to syslog
60#[cfg(feature = "syslog")]
61fn default_syslog_drain() -> Result<slog_async::Async> {
62    let syslog = slog_syslog::unix_3164(Facility::LOG_USER)?;
63
64    let drain = slog_async::Async::default(syslog.fuse());
65
66    Ok(drain)
67}
68
69#[cfg(all(target_os = "linux", feature = "journald"))]
70fn default_journald_drain() -> Result<slog_async::Async> {
71    let journald = JournaldDrain.ignore_res();
72    let drain = slog_async::Async::default(journald);
73
74    Ok(drain)
75}