use std::collections::HashMap;
use log;
use hostname;
use backends::Backend;
use message::{Message, WireMessage};
use errors::{Result, ErrorKind};
pub struct Logger {
hostname: String,
backend: Box<Backend>,
default_metadata: HashMap<String, String>,
panic_on_error: bool,
}
impl Logger {
pub fn new(backend: Box<Backend>) -> Result<Self> {
hostname::get_hostname()
.map(|hostname| Logger::new_with_hostname(backend, &hostname))
.ok_or(ErrorKind::LoggerCreateFailed("Failed to determine local hostname").into())
}
pub fn new_with_hostname(backend: Box<Backend>, hostname: &str) -> Logger {
Logger {
hostname: String::from(hostname),
backend: backend,
default_metadata: HashMap::new(),
panic_on_error: false,
}
}
pub fn install<T: Into<log::LogLevelFilter>>(self, log_level: T) -> Result<()> {
log::set_logger(|max_level| {
max_level.set(Into::into(log_level));
Box::new(self)
})?;
Ok(())
}
pub fn log_message(&self, msg: Message) {
let result = self.backend.log_message(WireMessage::new(msg, &self));
if result.is_err() && self.panic_on_error {
panic!(result.unwrap_err());
}
}
pub fn hostname(&self) -> &String {
&self.hostname
}
pub fn set_hostname(&mut self, hostname: String) -> &mut Self {
self.hostname = hostname;
self
}
pub fn default_metadata(&self) -> &HashMap<String, String> {
&self.default_metadata
}
pub fn set_default_metadata(&mut self, key: String, value: String) -> &mut Self {
self.default_metadata.insert(key, value);
self
}
pub fn panic_on_error(&self) -> bool {
self.panic_on_error
}
pub fn enable_panic_on_error(&mut self) -> &mut Self {
self.panic_on_error = true;
self
}
pub fn disable_panic_on_error(&mut self) -> &mut Self {
self.panic_on_error = false;
self
}
}
impl log::Log for Logger {
fn enabled(&self, _: &log::LogMetadata) -> bool {
true
}
fn log(&self, record: &log::LogRecord) {
if !self.enabled(record.metadata()) {
()
}
self.log_message(From::from(record))
}
}