bugsnag 0.2.1

The api of Bugsnag in rust.
Documentation
//! An example showing the integration of the bugsnag api with the logging framework of rust.
//!
//! This simple implementations consumes the api object. So, we can not change
//! any parameters after registering the logger.

extern crate bugsnag;
#[macro_use]
extern crate log;

use log::{LogLevel, LogMetadata, LogRecord, SetLoggerError};

/// Our logger for bugsnag
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"),
    );

    // initialize the logger
    BugsnagLogger::init(api, LogLevel::Warn).unwrap();

    // the following two messages should not show up in bugsnag, because
    // we set the maximum log level to errors
    debug!("Hello this is a debug message!");
    info!("Hello this is a info message!");

    // the following two should be send to bugsnag
    warn!("Hello this is a warn message!");
    error!("Hello this is a error message!");
}