#[cfg(target_os = "android")]
pub fn init() {
android_logd_logger::builder()
.tag("northstar")
.prepend_module(false)
.parse_filters("northstar=debug")
.init();
}
#[cfg(not(target_os = "android"))]
static TAG_SIZE: std::sync::atomic::AtomicUsize = std::sync::atomic::AtomicUsize::new(28);
#[cfg(not(target_os = "android"))]
pub fn init() {
use env_logger::fmt::Color;
use std::{io::Write, sync::atomic::Ordering};
fn color(target: &str) -> Color {
let hash = target.bytes().fold(42u8, |c, x| c ^ x);
Color::Ansi256(match hash {
c @ 0..=1 => c + 2,
c @ 16..=21 => c + 6,
c @ 52..=55 | c @ 126..=129 => c + 4,
c @ 163..=165 | c @ 200..=201 => c + 3,
c @ 207 => c + 1,
c @ 232..=240 => c + 9,
c => c,
})
}
let mut builder = env_logger::Builder::new();
builder.parse_filters("debug");
builder.format(|buf, record| {
let timestamp = buf.timestamp_millis().to_string();
let timestamp = timestamp.strip_suffix('Z').unwrap();
let mut level = buf.default_level_style(record.metadata().level());
level.set_bold(true);
let level = level.value(record.metadata().level().as_str());
let pid = std::process::id().to_string();
let mut pid_style = buf.style();
pid_style.set_color(color(&pid));
if let Some(target) = Option::from(record.target().is_empty())
.map(|_| record.target())
.or_else(|| record.module_path())
.map(|module_path| {
module_path
.strip_prefix("northstar::")
.unwrap_or(module_path)
})
.map(|module_path| {
module_path
.strip_prefix("northstar_runtime::")
.unwrap_or(module_path)
})
{
let mut tag_style = buf.style();
TAG_SIZE.fetch_max(target.len(), Ordering::SeqCst);
let tag_size = TAG_SIZE.load(Ordering::SeqCst);
tag_style.set_color(color(target));
writeln!(
buf,
"{} {:>s$} {} {:<5}: {}",
timestamp,
tag_style.value(target),
pid_style.value("⬤"),
level,
record.args(),
s = tag_size,
)
} else {
writeln!(
buf,
"{} {} {} {:<5}: {}",
timestamp,
" ".repeat(TAG_SIZE.load(Ordering::SeqCst)),
pid_style.value("⬤"),
level,
record.args(),
)
}
});
builder.init()
}