extern crate android_log_sys as log_ffi;
extern crate log;
use log_ffi::LogPriority;
use log::{Log,LogLevel,LogMetadata,LogRecord,SetLoggerError};
use std::ffi::{ CStr, CString };
fn android_log(prio: log_ffi::LogPriority, tag: &CStr, msg: &CStr) {
unsafe { log_ffi::__android_log_write(prio as log_ffi::c_int, tag.as_ptr(), msg.as_ptr()) };
}
type LogFun = extern fn(*const u8, *const u8);
struct PlatformLogger;
impl Log for PlatformLogger {
fn enabled(&self, _: &LogMetadata) -> bool {
true
}
fn log(&self, record: &LogRecord) {
let tag = CString::new(record.location().module_path()).unwrap();
let msg = CString::new(format!("{}", record.args())).unwrap();
match record.level() {
LogLevel::Warn => android_log(LogPriority::WARN, &tag, &msg),
LogLevel::Info => android_log(LogPriority::INFO, &tag, &msg),
LogLevel::Debug => android_log(LogPriority::DEBUG, &tag, &msg),
LogLevel::Error => android_log(LogPriority::ERROR, &tag, &msg),
LogLevel::Trace => android_log(LogPriority::VERBOSE, &tag, &msg),
}
}
}
pub fn init(log_level: LogLevel) -> Result<(), SetLoggerError> {
log::set_logger(|max_log_level| {
max_log_level.set(log_level.to_log_level_filter());
return Box::new(PlatformLogger);
})
}