extern crate bugsnag;
#[macro_use]
extern crate log;
use log::{LogLevel, LogMetadata, LogRecord, SetLoggerError};
struct BugsnagLogger {
max_loglevel: LogLevel,
api: bugsnag::Bugsnag,
}
impl BugsnagLogger {
pub fn init(api: bugsnag::Bugsnag, max_loglevel: LogLevel) -> Result<(), SetLoggerError> {
log::set_logger(|max_level| {
max_level.set(log::LogLevelFilter::Info);
Box::new(BugsnagLogger {
api: api,
max_loglevel: max_loglevel,
})
})
}
}
fn convert_log_level(level: LogLevel) -> bugsnag::Severity {
match level {
LogLevel::Info => bugsnag::Severity::Info,
LogLevel::Warn => bugsnag::Severity::Warning,
LogLevel::Error => bugsnag::Severity::Error,
_ => bugsnag::Severity::Info,
}
}
impl log::Log for BugsnagLogger {
fn enabled(&self, metadata: &LogMetadata) -> bool {
metadata.level() <= self.max_loglevel
}
fn log(&self, record: &LogRecord) {
if self.enabled(record.metadata()) {
let level = convert_log_level(record.metadata().level());
let level_str = record.metadata().level().to_string();
let message = record.args().to_string();
self.api.notify(&level_str, &message).severity(level);
}
}
}
fn main() {
let mut api =
bugsnag::Bugsnag::new("api-key", concat!(env!("CARGO_MANIFEST_DIR"), "/examples"));
api.set_app_info(
Some(env!("CARGO_PKG_VERSION")),
Some("development"),
Some("rust"),
);
BugsnagLogger::init(api, LogLevel::Warn).unwrap();
debug!("Hello this is a debug message!");
info!("Hello this is a info message!");
warn!("Hello this is a warn message!");
error!("Hello this is a error message!");
}