zlog settings

Conrad Irwin and Ben Kunkle created

Co-authored-by: Ben Kunkle <ben@zed.dev>

Change summary

Cargo.lock                                |  4 +-
crates/settings/src/settings_content.rs   |  6 +++
crates/zlog/Cargo.toml                    |  1 
crates/zlog/src/filter.rs                 | 11 ++---
crates/zlog_settings/Cargo.toml           |  3 -
crates/zlog_settings/src/zlog_settings.rs | 45 ++++++++++--------------
6 files changed, 34 insertions(+), 36 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -21001,6 +21001,7 @@ version = "0.1.0"
 dependencies = [
  "anyhow",
  "chrono",
+ "collections",
  "log",
  "tempfile",
  "workspace-hack",
@@ -21011,9 +21012,8 @@ name = "zlog_settings"
 version = "0.1.0"
 dependencies = [
  "anyhow",
+ "collections",
  "gpui",
- "schemars",
- "serde",
  "settings",
  "workspace-hack",
  "zlog",

crates/settings/src/settings_content.rs 🔗

@@ -39,6 +39,12 @@ pub struct SettingsContent {
 
     /// Configuration of audio in Zed.
     pub audio: Option<AudioSettingsContent>,
+
+    /// A map of log scopes to the desired log level.
+    /// Useful for filtering out noisy logs or enabling more verbose logging.
+    ///
+    /// Example: {"log": {"client": "warn"}}
+    pub log: Option<HashMap<String, String>>,
 }
 
 impl SettingsContent {

crates/zlog/Cargo.toml 🔗

@@ -15,6 +15,7 @@ path = "src/zlog.rs"
 default = []
 
 [dependencies]
+collections.workspace = true
 chrono.workspace = true
 log.workspace = true
 workspace-hack.workspace = true

crates/zlog/src/filter.rs 🔗

@@ -1,9 +1,8 @@
-use std::{
-    collections::{HashMap, VecDeque},
-    sync::{
-        OnceLock, RwLock,
-        atomic::{AtomicU8, Ordering},
-    },
+use collections::HashMap;
+use std::collections::VecDeque;
+use std::sync::{
+    OnceLock, RwLock,
+    atomic::{AtomicU8, Ordering},
 };
 
 use crate::{SCOPE_DEPTH_MAX, SCOPE_STRING_SEP_STR, Scope, ScopeAlloc, env_config, private};

crates/zlog_settings/Cargo.toml 🔗

@@ -17,8 +17,7 @@ default = []
 [dependencies]
 anyhow.workspace = true
 gpui.workspace = true
-schemars.workspace = true
-serde.workspace = true
+collections.workspace = true
 settings.workspace = true
 zlog.workspace = true
 workspace-hack.workspace = true

crates/zlog_settings/src/zlog_settings.rs 🔗

@@ -1,9 +1,8 @@
 //! # zlog_settings
-use anyhow::Result;
+use collections::HashMap;
+
 use gpui::App;
-use schemars::JsonSchema;
-use serde::{Deserialize, Serialize};
-use settings::{Settings, SettingsKey, SettingsStore, SettingsUi};
+use settings::{Settings, SettingsStore};
 
 pub fn init(cx: &mut App) {
     ZlogSettings::register(cx);
@@ -15,33 +14,27 @@ pub fn init(cx: &mut App) {
     .detach();
 }
 
-#[derive(
-    Clone,
-    Debug,
-    Default,
-    Serialize,
-    Deserialize,
-    PartialEq,
-    Eq,
-    JsonSchema,
-    SettingsUi,
-    SettingsKey,
-)]
-#[settings_key(key = "log")]
+#[derive(Clone, Debug)]
 pub struct ZlogSettings {
-    #[serde(default, flatten)]
-    pub scopes: std::collections::HashMap<String, String>,
+    /// A map of log scopes to the desired log level.
+    /// Useful for filtering out noisy logs or enabling more verbose logging.
+    ///
+    /// Example: {"log": {"client": "warn"}}
+    pub scopes: HashMap<String, String>,
 }
 
 impl Settings for ZlogSettings {
-    type FileContent = Self;
+    fn from_default(content: &settings::SettingsContent, _: &mut App) -> Option<Self> {
+        Some(ZlogSettings {
+            scopes: content.log.clone()?,
+        })
+    }
 
-    fn load(sources: settings::SettingsSources<Self::FileContent>, _: &mut App) -> Result<Self>
-    where
-        Self: Sized,
-    {
-        sources.json_merge()
+    fn refine(&mut self, content: &settings::SettingsContent, _: &mut App) {
+        if let Some(log) = &content.log {
+            self.scopes.extend(log.clone());
+        }
     }
 
-    fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {}
+    fn import_from_vscode(_: &settings::VsCodeSettings, _: &mut settings::SettingsContent) {}
 }