diff --git a/Cargo.toml b/Cargo.toml index d9b5041..0f030e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,15 +16,16 @@ travis-ci = { repository = "im-0/log4rs-syslog", branch = "master" } [features] default = ["file"] -file = ["log4rs/file", "log/serde", "serde", "serde_derive"] +file = ["log/serde", "serde", "serde_derive"] unstable = [] [dependencies] +anyhow = "*" bitflags = { version = "*", default_features = false } lazy_static = { version = "*", default_features = false } libc = { version = "*", default_features = false } log = { version = "*", default_features = false } -log4rs = { version = "*", default_features = false, features = ["pattern_encoder"] } +log4rs = { version = "*"} serde = { version = "*", default_features = false, optional = true } serde_derive = { version = "*", default_features = false, optional = true } diff --git a/README.md b/README.md index 053ac7e..0011ad0 100644 --- a/README.md +++ b/README.md @@ -69,12 +69,9 @@ extern crate log4rs; extern crate log4rs_syslog; fn main() { - let mut deserializers = log4rs::file::Deserializers::new(); - log4rs_syslog::register(&mut deserializers); - // Note that configuration file should have right extension, otherwise log4rs will fail to // recognize format. - log4rs::init_file("test.yaml", deserializers).unwrap(); + log4rs::init_file("test.yaml", Default::default()).unwrap(); trace!("Example trace message"); debug!("Example debug message"); diff --git a/examples/from_conf.rs b/examples/from_conf.rs index 6e75019..9b37b5c 100644 --- a/examples/from_conf.rs +++ b/examples/from_conf.rs @@ -7,9 +7,6 @@ extern crate tempfile; fn main() { use std::io::Write; - let mut deserializers = log4rs::file::Deserializers::new(); - log4rs_syslog::register(&mut deserializers); - let yaml_conf = br#" appenders: syslog: @@ -41,7 +38,7 @@ root: tmp_conf.write_all(yaml_conf).unwrap(); tmp_conf.flush().unwrap(); - log4rs::init_file(tmp_conf.path(), deserializers).unwrap(); + log4rs::init_file(tmp_conf.path(), Default::default()).unwrap(); trace!("Example trace message"); debug!("Example debug message"); diff --git a/src/file.rs b/src/file.rs deleted file mode 100644 index d22e3fa..0000000 --- a/src/file.rs +++ /dev/null @@ -1,114 +0,0 @@ -#![forbid(unsafe_code)] - -use std; - -use libc; -use log; -use log4rs; -use syslog; - -#[derive(Deserialize)] -struct SyslogAppenderOpenlogConfig { - ident: String, - option: syslog::LogOption, - facility: syslog::Facility, -} - -#[derive(PartialEq, Eq, Hash, PartialOrd, Ord, Deserialize)] -#[allow(non_camel_case_types)] -enum FakeLibcLogLevel { - LOG_EMERG, - LOG_ALERT, - LOG_CRIT, - LOG_ERR, - LOG_WARNING, - LOG_NOTICE, - LOG_INFO, - LOG_DEBUG, -} - -type LevelMapConf = std::collections::BTreeMap; - -#[derive(Deserialize)] -struct SyslogAppenderConfig { - openlog: Option, - encoder: Option, - level_map: Option, -} - -struct SyslogAppenderDeserializer; - -impl log4rs::file::Deserialize for SyslogAppenderDeserializer { - type Trait = log4rs::append::Append; - type Config = SyslogAppenderConfig; - - fn deserialize( - &self, - config: Self::Config, - deserializers: &log4rs::file::Deserializers, - ) -> Result, Box> { - let mut builder = syslog::SyslogAppender::builder(); - - if let Some(openlog_conf) = config.openlog { - builder = builder.openlog( - &openlog_conf.ident, - openlog_conf.option, - openlog_conf.facility, - ); - }; - - if let Some(encoder_conf) = config.encoder { - builder = builder.encoder(deserializers.deserialize(&encoder_conf.kind, encoder_conf.config)?); - } - - if let Some(level_map) = config.level_map { - let mut map = std::collections::BTreeMap::new(); - for (level, libc_level) in level_map { - let libc_level = match libc_level { - FakeLibcLogLevel::LOG_EMERG => libc::LOG_EMERG, - FakeLibcLogLevel::LOG_ALERT => libc::LOG_ALERT, - FakeLibcLogLevel::LOG_CRIT => libc::LOG_CRIT, - FakeLibcLogLevel::LOG_ERR => libc::LOG_ERR, - FakeLibcLogLevel::LOG_WARNING => libc::LOG_WARNING, - FakeLibcLogLevel::LOG_NOTICE => libc::LOG_NOTICE, - FakeLibcLogLevel::LOG_INFO => libc::LOG_INFO, - FakeLibcLogLevel::LOG_DEBUG => libc::LOG_DEBUG, - }; - let _ = map.insert(level, libc_level); - } - - for level in &[ - log::Level::Error, - log::Level::Warn, - log::Level::Info, - log::Level::Debug, - log::Level::Trace, - ] { - let _ = map.get(level) - .ok_or_else(|| format!("Log level missing in map: {:?}", level))?; - } - - builder = builder.level_map(Box::new(move |l| map[&l])); - } - - Ok(Box::new(builder.build())) - } -} - -/// Register deserializer for creating syslog appender based on log4rs configuration file. -/// -/// See `./examples/from_conf.rs` for full example. -/// -/// # Examples -/// -/// ``` -/// extern crate log4rs; -/// extern crate log4rs_syslog; -/// -/// let mut deserializers = log4rs::file::Deserializers::new(); -/// log4rs_syslog::register(&mut deserializers); -/// let result = log4rs::init_file("/path/to/log-conf.yaml", deserializers); -/// ``` -pub fn register(deserializers: &mut log4rs::file::Deserializers) { - deserializers.insert("libc-syslog", SyslogAppenderDeserializer); -} diff --git a/src/lib.rs b/src/lib.rs index 31cb0a6..5884ca4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,13 +37,6 @@ extern crate serde_derive; #[cfg(feature = "unstable")] extern crate test; // For benchmark. -#[cfg(target_family = "unix")] -#[cfg(feature = "file")] -mod file; -#[cfg(target_family = "unix")] -#[cfg(feature = "file")] -pub use file::*; - #[cfg(target_family = "unix")] mod syslog; #[cfg(target_family = "unix")] diff --git a/src/syslog.rs b/src/syslog.rs index 6cc7df8..c6eb2b7 100644 --- a/src/syslog.rs +++ b/src/syslog.rs @@ -47,11 +47,11 @@ impl std::io::Write for BufWriter { impl log4rs::encode::Write for BufWriter {} /// Function for mapping rust's `log` levels to `libc`'s log levels. -pub type LevelMap = Fn(log::Level) -> libc::c_int + Send + Sync; +pub type LevelMap = dyn Fn(log::Level) -> libc::c_int + Send + Sync; /// An appender which writes log events into syslog using `libc`'s syslog() function. pub struct SyslogAppender { - encoder: Box, + encoder: Box, level_map: Option>, } @@ -81,7 +81,7 @@ impl SyslogAppender { } impl log4rs::append::Append for SyslogAppender { - fn append(&self, record: &log::Record) -> std::result::Result<(), Box> { + fn append(&self, record: &log::Record) -> anyhow::Result<()> { let mut buf = BufWriter::new(); self.encoder.encode(&mut buf, record)?; @@ -315,14 +315,14 @@ lazy_static! { /// Builder for `SyslogAppender`. pub struct SyslogAppenderBuilder { - encoder: Option>, + encoder: Option>, openlog_args: Option, level_map: Option>, } impl SyslogAppenderBuilder { /// Set custom encoder. - pub fn encoder(mut self, encoder: Box) -> Self { + pub fn encoder(mut self, encoder: Box) -> Self { self.encoder = Some(encoder); self }