use cassandra_sys::CassLogLevel_;
use cassandra_sys::CassLogMessage;
use cassandra_sys::CassLogCallback;
use cassandra_sys::cass_log_set_callback;
use cassandra_sys::cass_log_set_level;
use cassandra::util::Protected;
use std::ffi::CStr;
use std::os::raw;
use std::ptr;
use std::boxed::Box;
use std::borrow::Borrow;
use slog;
#[derive(Debug, Eq, PartialEq, PartialOrd, Ord, Copy, Clone, Hash)]
#[allow(missing_docs)] #[allow(non_camel_case_types)] pub enum LogLevel {
DISABLED,
CRITICAL,
ERROR,
WARN,
INFO,
DEBUG,
TRACE,
LAST_ENTRY,
}
enhance_nullary_enum!(LogLevel, CassLogLevel_, {
(DISABLED, CASS_LOG_DISABLED, "DISABLED"),
(CRITICAL, CASS_LOG_CRITICAL, "CRITICAL"),
(ERROR, CASS_LOG_ERROR, "ERROR"),
(WARN, CASS_LOG_WARN, "WARN"),
(INFO, CASS_LOG_INFO, "INFO"),
(DEBUG, CASS_LOG_DEBUG, "DEBUG"),
(TRACE, CASS_LOG_TRACE, "TRACE"),
(LAST_ENTRY, CASS_LOG_LAST_ENTRY, "LAST_ENTRY"),
});
pub fn set_level(level: LogLevel) { unsafe { cass_log_set_level(level.inner()) } }
unsafe extern "C" fn logger_callback(log: *const CassLogMessage, data: *mut raw::c_void) {
let log = &*log;
let logger: &slog::Logger = &*(data as *const _);
let message: &str = &CStr::from_ptr(log.message.as_ptr()).to_string_lossy();
let time_ms: u64 = log.time_ms;
let file: &str = &CStr::from_ptr(log.file).to_string_lossy();
let line: i32 = log.line;
let function: &str = &CStr::from_ptr(log.file).to_string_lossy();
let kv = o!(
"time_ms" => time_ms,
"file" => file,
"line" => line,
"function" => function
);
match log.severity {
CassLogLevel_::CASS_LOG_DISABLED |
CassLogLevel_::CASS_LOG_CRITICAL => crit!(logger, "{}", message; kv),
CassLogLevel_::CASS_LOG_ERROR => error!(logger, "{}", message; kv),
CassLogLevel_::CASS_LOG_WARN => warn!(logger, "{}", message; kv),
CassLogLevel_::CASS_LOG_INFO => info!(logger, "{}", message; kv),
CassLogLevel_::CASS_LOG_DEBUG => debug!(logger, "{}", message; kv),
CassLogLevel_::CASS_LOG_TRACE |
CassLogLevel_::CASS_LOG_LAST_ENTRY => trace!(logger, "{}", message; kv),
};
}
pub fn set_logger(logger: Option<slog::Logger>) {
unsafe {
match logger {
Some(logger) => {
let data = Box::new(logger);
cass_log_set_callback(Some(logger_callback), Box::into_raw(data) as _)
},
None => {
cass_log_set_callback(None, ptr::null_mut())
},
}
}
}