Skip to content

Commit 6285053

Browse files
committed
Support for capturing KV values via sval and serde
1 parent 5c4429c commit 6285053

File tree

4 files changed

+101
-5
lines changed

4 files changed

+101
-5
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ jobs:
4949
fail-fast: false
5050
matrix:
5151
os: ['ubuntu-latest', 'windows-latest', 'macos-latest']
52-
fn_features: ['', 'log native libsystemd multi-thread runtime-pattern serde_json']
52+
fn_features: ['', 'log native libsystemd multi-thread runtime-pattern serde serde_json sval']
5353
cfg_feature: ['', 'flexible-string', 'source-location']
5454
runs-on: ${{ matrix.os }}
5555
steps:

spdlog/Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ native = []
3737
libsystemd = ["libsystemd-sys"]
3838
multi-thread = ["crossbeam"]
3939
runtime-pattern = ["spdlog-internal"]
40-
serde_json = ["serde", "dep:serde_json", "value-bag/serde1"]
40+
serde = ["dep:serde", "value-bag/serde"]
41+
serde_json = ["serde", "dep:serde_json"]
42+
sval = ["value-bag/sval"]
4143

4244
[dependencies]
4345
arc-swap = "1.5.1"
@@ -74,6 +76,8 @@ crossbeam = "0.8.2"
7476
regex = "1.7.0"
7577
paste = "1.0.14"
7678
trybuild = "1.0.90"
79+
sval = "2.14.0"
80+
sval_derive = "2.14.0"
7781

7882
# [bench-dependencies]
7983
log = "=0.4.22"

spdlog/src/kv.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,22 @@ impl<'a> KeyValues<'a> {
9999
}
100100
}
101101

102+
pub fn get(&self, key: Key) -> Option<Value<'a>> {
103+
match self.0 {
104+
KeyValuesInner::Borrowed(p) => {
105+
p.iter()
106+
.find_map(|(k, v)| if k == &key { Some(v.clone()) } else { None })
107+
}
108+
KeyValuesInner::Owned(p) => p.iter().find_map(|(k, v)| {
109+
if k.as_ref() == key {
110+
Some(v.by_ref())
111+
} else {
112+
None
113+
}
114+
}),
115+
}
116+
}
117+
102118
pub fn iter(&self) -> KeyValuesIter<'a> {
103119
match &self.0 {
104120
KeyValuesInner::Borrowed(p) => KeyValuesIter(KeyValuesIterInner::Borrowed(p.iter())),

spdlog/src/log_macros.rs

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ macro_rules! __kv {
193193
(@{$($done:tt)*} $k:ident $(= $v:expr)? $(,$($rest:tt)*)?) => ($crate::__kv!(@{$($done)* $k [ ] $(= $v)?,} $($($rest)*)?));
194194
(@{$($done:tt)*} $k:ident : $(= $v:expr)? $(,$($rest:tt)*)?) => ($crate::__kv!(@{$($done)* $k [: ] $(= $v)?,} $($($rest)*)?));
195195
(@{$($done:tt)*} $k:ident :? $(= $v:expr)? $(,$($rest:tt)*)?) => ($crate::__kv!(@{$($done)* $k [:?] $(= $v)?,} $($($rest)*)?));
196+
(@{$($done:tt)*} $k:ident :sval $(= $v:expr)? $(,$($rest:tt)*)?) => ($crate::__kv!(@{$($done)* $k [:sval] $(= $v)?,} $($($rest)*)?));
197+
(@{$($done:tt)*} $k:ident :serde $(= $v:expr)? $(,$($rest:tt)*)?) => ($crate::__kv!(@{$($done)* $k [:serde] $(= $v)?,} $($($rest)*)?));
196198
(@{$( $k:ident [$($modifier:tt)*] $(= $v:expr)? ),+ $(,)?}) => {
197199
&[$(($crate::kv::Key::__from_static_str(stringify!($k)), $crate::__kv_value!($k [$($modifier)*] $(= $v)?))),+]
198200
};
@@ -203,18 +205,28 @@ macro_rules! __kv {
203205
macro_rules! __kv_value {
204206
($k:ident [$($modifier:tt)*]) => { $crate::__kv_value!($k [$($modifier)*] = $k) };
205207
($k:ident [ ] = $v:expr) => { $crate::kv::Value::from(&$v) };
206-
($k:ident [: ] = $v:expr) => { $crate::kv::Value::from_display(&$v) };
207-
($k:ident [:?] = $v:expr) => { $crate::kv::Value::from_debug(&$v) };
208+
($k:ident [: ] = $v:expr) => { $crate::kv::Value::capture_display(&$v) };
209+
($k:ident [:?] = $v:expr) => { $crate::kv::Value::capture_debug(&$v) };
210+
($k:ident [:sval] = $v:expr) => { $crate::kv::Value::capture_sval2(&$v) };
211+
($k:ident [:serde] = $v:expr) => { $crate::kv::Value::capture_serde1(&$v) };
208212
}
209213

210214
#[cfg(test)]
211215
mod tests {
212216
use std::{
213217
fmt::{self, Debug, Display},
214218
sync::Arc,
219+
vec,
215220
};
216221

217-
use crate::{kv::KeyInner, prelude::*, test_utils::*};
222+
use crate::{
223+
formatter::Formatter,
224+
kv::{Key, KeyInner},
225+
prelude::*,
226+
sink::Sink,
227+
test_utils::{self, *},
228+
ErrorHandler, Record,
229+
};
218230

219231
#[test]
220232
fn syntax_and_records() {
@@ -390,4 +402,68 @@ mod tests {
390402

391403
assert_eq!(check, from_sink);
392404
}
405+
406+
#[test]
407+
fn kv_types() {
408+
struct Asserter;
409+
410+
impl Sink for Asserter {
411+
fn should_log(&self, _: Level) -> bool {
412+
true
413+
}
414+
fn flush(&self) -> crate::Result<()> {
415+
Ok(())
416+
}
417+
fn level_filter(&self) -> LevelFilter {
418+
LevelFilter::All
419+
}
420+
fn set_level_filter(&self, _: LevelFilter) {
421+
unimplemented!()
422+
}
423+
fn set_formatter(&self, _: Box<dyn Formatter>) {
424+
unimplemented!()
425+
}
426+
fn set_error_handler(&self, _: Option<ErrorHandler>) {
427+
unimplemented!()
428+
}
429+
430+
fn log(&self, record: &Record) -> crate::Result<()> {
431+
let kvs = record.key_values();
432+
let value = kvs.get(Key::from_str("v")).unwrap();
433+
assert_eq!(kvs.len(), 1);
434+
435+
match record.payload() {
436+
"1" => assert!(value.to_i64().is_some()),
437+
"2" => assert!(value.to_str().is_some()),
438+
"3" => assert!(value.to_i64().is_some()),
439+
"4" => assert!(value.to_i64().is_some()),
440+
"5" => assert!(value.is::<Vec<i32>>()),
441+
"6" => assert!(value.is::<Data>()),
442+
"7" => assert!(value.is::<Data>()),
443+
_ => panic!(),
444+
}
445+
Ok(())
446+
}
447+
}
448+
449+
let asserter = test_utils::build_test_logger(|b| b.sink(Arc::new(Asserter)));
450+
451+
#[derive(sval_derive::Value, serde::Serialize)]
452+
struct Data {
453+
i: i32,
454+
v: Vec<i32>,
455+
}
456+
let data = Data {
457+
i: 1,
458+
v: vec![1, 2],
459+
};
460+
461+
info!(logger: asserter, "1", kv: { v = 1 });
462+
info!(logger: asserter, "2", kv: { v = "string" });
463+
info!(logger: asserter, "3", kv: { v: = 1 });
464+
info!(logger: asserter, "4", kv: { v:? = 1 });
465+
info!(logger: asserter, "5", kv: { v:sval = vec![1, 2] });
466+
info!(logger: asserter, "6", kv: { v:sval = data });
467+
info!(logger: asserter, "7", kv: { v:serde = data });
468+
}
393469
}

0 commit comments

Comments
 (0)