From 064a5a69406d8d44e005c94e914126626d1bf460 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Fri, 29 Jul 2022 15:06:11 +0200 Subject: [PATCH] cln-plugin: Add log filtering support We filter based on the environment variable `CLN_PLUGIN_LOG`, defaulting to `info` as that is not as noisy as `debug` or `trace`, at least libraries will not spam us too heavily. Changelog-Added cln-plugin: The logs level from cln-plugins can be configured by the `CLN_PLUGIN_LOG` environment variable. --- plugins/Cargo.toml | 2 +- plugins/src/logging.rs | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/Cargo.toml b/plugins/Cargo.toml index 44cca27f9..88e96b795 100644 --- a/plugins/Cargo.toml +++ b/plugins/Cargo.toml @@ -21,8 +21,8 @@ tokio = { version="1", features = ['io-std', 'rt', 'sync', 'macros', 'io-util'] tokio-stream = "0.1" futures = "0.3" cln-rpc = { path = "../cln-rpc", version = "0.1.0" } +env_logger = "0.9" [dev-dependencies] tokio = { version = "1", features = ["macros", "rt-multi-thread", ] } -env_logger = "0.9" cln-grpc = { path = "../cln-grpc" } diff --git a/plugins/src/logging.rs b/plugins/src/logging.rs index 7a90b84aa..365648463 100644 --- a/plugins/src/logging.rs +++ b/plugins/src/logging.rs @@ -1,6 +1,7 @@ use crate::codec::JsonCodec; +use env_logger::filter; use futures::SinkExt; -use log::{Level, Metadata, Record}; +use log::{Metadata, Record}; use serde::Serialize; use std::sync::Arc; use tokio::io::AsyncWrite; @@ -42,6 +43,7 @@ struct PluginLogger { // happen to emit a log record while holding the lock on the // plugin connection. sender: tokio::sync::mpsc::UnboundedSender, + filter: filter::Filter, } /// Initialize the logger starting a flusher to the passed in sink. @@ -50,6 +52,10 @@ where O: AsyncWrite + Send + Unpin + 'static, { let out = out.clone(); + + let filter_str = std::env::var("CLN_PLUGIN_LOG").unwrap_or("info".to_string()); + let filter = filter::Builder::new().parse(&filter_str).build(); + let (sender, mut receiver) = tokio::sync::mpsc::unbounded_channel::(); tokio::spawn(async move { while let Some(i) = receiver.recv().await { @@ -68,17 +74,17 @@ where .await; } }); - log::set_boxed_logger(Box::new(PluginLogger { sender })) + log::set_boxed_logger(Box::new(PluginLogger { sender, filter })) .map(|()| log::set_max_level(log::LevelFilter::Debug)) } impl log::Log for PluginLogger { fn enabled(&self, metadata: &Metadata) -> bool { - metadata.level() <= Level::Debug + self.filter.enabled(metadata) } fn log(&self, record: &Record) { - if self.enabled(record.metadata()) { + if self.filter.matches(record) { self.sender .send(LogEntry { level: record.level().into(),