1extern crate log;
2
3mod ffi;
4
5use std::os::raw::{c_char, c_int};
6use log::{Level, Log, Metadata, Record, SetLoggerError};
7use ffi::android_LogPriority;
8
9pub struct Logger;
10
11impl Log for Logger {
12 fn enabled(&self, _metadata: &Metadata) -> bool {
13 true
14 }
15
16 fn log(&self, record: &Record) {
17 let prio = match record.level() {
18 Level::Error => android_LogPriority::ANDROID_LOG_ERROR,
19 Level::Warn => android_LogPriority::ANDROID_LOG_WARN,
20 Level::Info => android_LogPriority::ANDROID_LOG_INFO,
21 Level::Debug => android_LogPriority::ANDROID_LOG_DEBUG,
22 Level::Trace => android_LogPriority::ANDROID_LOG_VERBOSE,
23 };
24 let text = format!("{}", record.args());
25 let _ret = unsafe {
26 ffi::__android_log_write(
27 prio as c_int,
28 record.target().as_ptr() as *const c_char,
29 text.as_ptr() as *const c_char,
30 )
31 };
32 }
33
34 fn flush(&self) {}
35}
36
37pub fn init() -> Result<(), SetLoggerError> {
38 log::set_boxed_logger(Box::new(Logger {}))
39}