From 160f48043e55cc579d6bb77eb12924a11e134e65 Mon Sep 17 00:00:00 2001
From: Jason Volk <jason@zemos.net>
Date: Thu, 11 Jul 2024 00:42:49 +0000
Subject: [PATCH] add selective log handle reload

Signed-off-by: Jason Volk <jason@zemos.net>
---
 src/admin/debug/commands.rs | 16 ++++++++++++++--
 src/core/log/reload.rs      |  7 ++++---
 src/core/log/suppress.rs    |  4 ++--
 src/main/tracing.rs         |  2 +-
 4 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/admin/debug/commands.rs b/src/admin/debug/commands.rs
index 5fd0360d9..a50874678 100644
--- a/src/admin/debug/commands.rs
+++ b/src/admin/debug/commands.rs
@@ -314,6 +314,8 @@ pub(super) async fn force_device_list_updates(_body: Vec<&str>) -> Result<RoomMe
 pub(super) async fn change_log_level(
 	_body: Vec<&str>, filter: Option<String>, reset: bool,
 ) -> Result<RoomMessageEventContent> {
+	let handles = &["console"];
+
 	if reset {
 		let old_filter_layer = match EnvFilter::try_new(&services().globals.config.log) {
 			Ok(s) => s,
@@ -324,7 +326,12 @@ pub(super) async fn change_log_level(
 			},
 		};
 
-		match services().server.log.reload.reload(&old_filter_layer) {
+		match services()
+			.server
+			.log
+			.reload
+			.reload(&old_filter_layer, Some(handles))
+		{
 			Ok(()) => {
 				return Ok(RoomMessageEventContent::text_plain(format!(
 					"Successfully changed log level back to config value {}",
@@ -349,7 +356,12 @@ pub(super) async fn change_log_level(
 			},
 		};
 
-		match services().server.log.reload.reload(&new_filter_layer) {
+		match services()
+			.server
+			.log
+			.reload
+			.reload(&new_filter_layer, Some(handles))
+		{
 			Ok(()) => {
 				return Ok(RoomMessageEventContent::text_plain("Successfully changed log level"));
 			},
diff --git a/src/core/log/reload.rs b/src/core/log/reload.rs
index cfed785d8..0b72d7871 100644
--- a/src/core/log/reload.rs
+++ b/src/core/log/reload.rs
@@ -45,12 +45,13 @@ pub fn add(&self, name: &str, handle: Handle) {
 			.insert(name.into(), handle);
 	}
 
-	pub fn reload(&self, new_value: &EnvFilter) -> Result<()> {
+	pub fn reload(&self, new_value: &EnvFilter, names: Option<&[&str]>) -> Result<()> {
 		self.handles
 			.lock()
 			.expect("locked")
-			.values()
-			.for_each(|handle| {
+			.iter()
+			.filter(|(name, _)| names.map_or(false, |names| names.contains(&name.as_str())))
+			.for_each(|(_, handle)| {
 				_ = handle.reload(new_value.clone()).or_else(error::else_log);
 			});
 
diff --git a/src/core/log/suppress.rs b/src/core/log/suppress.rs
index 6e883086d..ca2d54854 100644
--- a/src/core/log/suppress.rs
+++ b/src/core/log/suppress.rs
@@ -18,7 +18,7 @@ fn from_filters(server: &Arc<Server>, restore: EnvFilter, suppress: &EnvFilter)
 		server
 			.log
 			.reload
-			.reload(suppress)
+			.reload(suppress, Some(&["console"]))
 			.expect("log filter reloaded");
 		Self {
 			server: server.clone(),
@@ -32,7 +32,7 @@ fn drop(&mut self) {
 		self.server
 			.log
 			.reload
-			.reload(&self.restore)
+			.reload(&self.restore, Some(&["console"]))
 			.expect("log filter reloaded");
 	}
 }
diff --git a/src/main/tracing.rs b/src/main/tracing.rs
index 4c8fde5a2..78c35c662 100644
--- a/src/main/tracing.rs
+++ b/src/main/tracing.rs
@@ -27,7 +27,7 @@ pub(crate) fn init(config: &Config) -> (LogLevelReloadHandles, TracingFlameGuard
 	};
 
 	let (fmt_reload_filter, fmt_reload_handle) = reload::Layer::new(filter_layer.clone());
-	reload_handles.add("format", Box::new(fmt_reload_handle));
+	reload_handles.add("console", Box::new(fmt_reload_handle));
 
 	let subscriber = Registry::default().with(fmt_layer.with_filter(fmt_reload_filter));
 
-- 
GitLab