extern crate bugsnag;
#[macro_use]
extern crate log;
use log::{LogRecord, LogLevel, LogMetadata, SetLoggerError};
use bugsnag::stacktrace;
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 stacktrace = stacktrace::create_stacktrace(self.api.get_project_source_dir());
self.api.notify(record.metadata().level().to_string().as_str(),
record.args().to_string().as_str(),
level,
&stacktrace,
None);
}
}
}
fn main() {
let mut api = bugsnag::Bugsnag::new("api-key", Some(env!("CARGO_MANIFEST_DIR")));
api.set_app_info(Some(env!("CARGO_PKG_VERSION")),
Some("development"),
Some("rust"));
BugsnagLogger::init(api, LogLevel::Warn);
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!");
}