blob: 2363dcc7830ff51bd2b7ab9ab6280b6136d46470 [file] [edit]
// Copyright 2023 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use anyhow::Result;
use log::LevelFilter;
use logging::{FfxLog, FfxLogSink, FormatOpts, LogSinkTrait, TargetsFilter};
use std::sync::{Arc, LazyLock, Mutex};
static LOGGING_ID: LazyLock<u64> = LazyLock::new(generate_id);
fn generate_id() -> u64 {
rand::random::<u64>()
}
pub fn init(level: LevelFilter) -> Result<()> {
configure_subscribers(level);
Ok(())
}
struct OnFilter;
impl logging::Filter for OnFilter {
fn should_emit(&self, _record: &log::Metadata<'_>) -> bool {
true
}
}
fn configure_subscribers(level: LevelFilter) {
let sinks: Vec<Box<dyn LogSinkTrait>> =
vec![FfxLogSink::new(Arc::new(Mutex::new(std::io::stdout()))).boxed()];
let targets_filter = TargetsFilter::new(vec![]);
let format = FormatOpts::new(*LOGGING_ID);
let logger = FfxLog::new(sinks, format, OnFilter {}, level, targets_filter);
let _ = log::set_boxed_logger(Box::new(logger))
.map(|()| log::set_max_level(log::LevelFilter::Trace));
}