1use parking_lot::RwLock;
4use std::sync::Arc;
5use tracing::{subscriber::Interest, Metadata};
6use tracing_subscriber::{layer::Context, Layer};
7
8pub(crate) const NODE_USER_LOG_TARGET: &str = "node::user";
10
11pub(crate) const EVM_CONSOLE_LOG_TARGET: &str = "node::console";
13
14#[derive(Clone, Debug, Default)]
19pub struct NodeLogLayer {
20 state: LoggingManager,
21}
22
23impl NodeLogLayer {
24 pub fn new(state: LoggingManager) -> Self {
26 Self { state }
27 }
28}
29
30impl<S> Layer<S> for NodeLogLayer
32where
33 S: tracing::Subscriber,
34{
35 fn register_callsite(&self, metadata: &'static Metadata<'static>) -> Interest {
36 if metadata.target() == NODE_USER_LOG_TARGET || metadata.target() == EVM_CONSOLE_LOG_TARGET
37 {
38 Interest::sometimes()
39 } else {
40 Interest::never()
41 }
42 }
43
44 fn enabled(&self, metadata: &Metadata<'_>, _ctx: Context<'_, S>) -> bool {
45 self.state.is_enabled() &&
46 (metadata.target() == NODE_USER_LOG_TARGET ||
47 metadata.target() == EVM_CONSOLE_LOG_TARGET)
48 }
49}
50
51#[derive(Clone, Debug)]
53pub struct LoggingManager {
54 pub enabled: Arc<RwLock<bool>>,
56}
57
58impl LoggingManager {
59 pub fn is_enabled(&self) -> bool {
61 *self.enabled.read()
62 }
63
64 pub fn set_enabled(&self, enabled: bool) {
66 let mut current = self.enabled.write();
67 *current = enabled;
68 }
69}
70
71impl Default for LoggingManager {
72 fn default() -> Self {
73 Self { enabled: Arc::new(RwLock::new(true)) }
74 }
75}