1use crate::{counters::STRUCT_LOG_COUNT, Event, Metadata};
11
12use once_cell::sync::OnceCell;
13use std::sync::Arc;
14
15static LOGGER: OnceCell<Arc<dyn Logger>> = OnceCell::new();
17
18pub trait Logger: Sync + Send + 'static {
20 fn enabled(&self, metadata: &Metadata) -> bool;
22
23 fn record(&self, event: &Event);
25
26 fn flush(&self);
28}
29
30pub(crate) fn dispatch(event: &Event) {
32 if let Some(logger) = LOGGER.get() {
33 STRUCT_LOG_COUNT.inc();
34 logger.record(event)
35 }
36}
37
38pub(crate) fn enabled(metadata: &Metadata) -> bool {
40 LOGGER
41 .get()
42 .map(|logger| logger.enabled(metadata))
43 .unwrap_or(false)
44}
45
46pub fn set_global_logger(logger: Arc<dyn Logger>) {
48 if LOGGER.set(logger).is_err() {
49 eprintln!("Global logger has already been set");
50 }
51}
52
53pub fn flush() {
55 if let Some(logger) = LOGGER.get() {
56 logger.flush();
57 }
58}