diem_logger/
logger.rs

1// Copyright (c) The Diem Core Contributors
2// SPDX-License-Identifier: Apache-2.0
3
4// Copyright 2021 Conflux Foundation. All rights reserved.
5// Conflux is free software and distributed under GNU General Public License.
6// See http://www.gnu.org/licenses/
7
8//! Global logger definition and functions
9
10use crate::{counters::STRUCT_LOG_COUNT, Event, Metadata};
11
12use once_cell::sync::OnceCell;
13use std::sync::Arc;
14
15/// The global `Logger`
16static LOGGER: OnceCell<Arc<dyn Logger>> = OnceCell::new();
17
18/// A trait encapsulating the operations required of a logger.
19pub trait Logger: Sync + Send + 'static {
20    /// Determines if an event with the specified metadata would be logged
21    fn enabled(&self, metadata: &Metadata) -> bool;
22
23    /// Record an event
24    fn record(&self, event: &Event);
25
26    /// Flush any buffered events
27    fn flush(&self);
28}
29
30/// Record a logging event to the global `Logger`
31pub(crate) fn dispatch(event: &Event) {
32    if let Some(logger) = LOGGER.get() {
33        STRUCT_LOG_COUNT.inc();
34        logger.record(event)
35    }
36}
37
38/// Check if the global `Logger` is enabled
39pub(crate) fn enabled(metadata: &Metadata) -> bool {
40    LOGGER
41        .get()
42        .map(|logger| logger.enabled(metadata))
43        .unwrap_or(false)
44}
45
46/// Sets the global `Logger` exactly once
47pub 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
53/// Flush the global `Logger`
54pub fn flush() {
55    if let Some(logger) = LOGGER.get() {
56        logger.flush();
57    }
58}