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 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 let drain = slog::Duplicate(default_discard()?, default_discard()?).fuse();
21
22 #[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 let logger = slog::Logger::root(drain, o!("who" => "rust-starter"));
37
38 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#[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#[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}