Add bind-style context helpers

This commit is contained in:
Nanaloveyuki
2026-05-10 12:12:11 +08:00
parent 2e008b649c
commit a26ec6399c
9 changed files with 86 additions and 0 deletions
+9
View File
@@ -14,6 +14,15 @@ test "context sink merges fields" {
logger.info("hello", fields=[field("mode", "test")])
}
test "fields helper builds field arrays ergonomically" {
let items = fields([("service", "bitlogger"), ("mode", "test")])
inspect(items.length(), content="2")
inspect(items[0].key, content="service")
inspect(items[0].value, content="bitlogger")
inspect(items[1].key, content="mode")
inspect(items[1].value, content="test")
}
test "fanout sink can write to plain and json outputs" {
let logger = Logger::new(
fanout_sink(console_sink(), json_console_sink()),
+25
View File
@@ -259,6 +259,31 @@ test "callback sink sees child target and context logger shape" {
inspect(captured_timestamp.val > 0UL, content="true")
}
test "bind aliases context fields ergonomically" {
let captured_target : Ref[String] = Ref::new("")
let captured_message : Ref[String] = Ref::new("")
let captured_fields : Ref[Array[Field]] = Ref::new([])
let logger = Logger::new(
callback_sink(fn(rec) {
captured_target.val = rec.target
captured_message.val = rec.message
captured_fields.val = rec.fields
}),
min_level=Level::Info,
target="bind",
).bind(fields([("service", "bitlogger"), ("scope", "audit")]))
logger.info("ready", fields=[field("mode", "test")])
inspect(captured_target.val, content="bind")
inspect(captured_message.val, content="ready")
inspect(captured_fields.val.length(), content="3")
inspect(captured_fields.val[0].key, content="service")
inspect(captured_fields.val[0].value, content="bitlogger")
inspect(captured_fields.val[1].key, content="scope")
inspect(captured_fields.val[1].value, content="audit")
inspect(captured_fields.val[2].key, content="mode")
inspect(captured_fields.val[2].value, content="test")
}
test "buffered sink flushes manually" {
let flushed_messages : Ref[Array[String]] = Ref::new([])
let sink = buffered_sink(
+10
View File
@@ -36,6 +36,8 @@ BitLogger 是一个基于 MoonBit 的结构化日志库。
- 提供 `target_has_prefix(...)``message_contains(...)``field_equals(...)` 等可复用过滤辅助函数
- record patching via `with_patch(...)` and `patch_sink(...)`
- 支持 `with_patch(...)``patch_sink(...)` 以及常见 record patch helper
- context binding via `bind(...)` and `fields(...)`
- 支持 `bind(...)``fields(...)`,更顺手地封装上下文字段
- explicit queued delivery via `queued_sink(...)` and `with_queue(...)`
- 支持 `queued_sink(...)``with_queue(...)`、有界积压与溢出策略
- configurable text formatting via `text_formatter(...)`, `format_text(...)`, `text_console_sink(...)`, and template-driven `template` output
@@ -133,6 +135,14 @@ test {
}
```
```mbt check
test {
let logger = Logger::new(console_sink(), target="audit")
.bind(fields([("service", "bitlogger"), ("scope", "login")]))
logger.info("accepted", fields=[field("user", "alice")])
}
```
```mbt check
test {
let logger = Logger::new(console_sink(), target="queue")
+4
View File
@@ -36,6 +36,10 @@ pub fn[S] Logger::with_context_fields(self : Logger[S], fields : Array[Field]) -
}
}
pub fn[S] Logger::bind(self : Logger[S], fields : Array[Field]) -> Logger[ContextSink[S]] {
self.with_context_fields(fields)
}
pub fn[S] Logger::with_filter(self : Logger[S], predicate : (Record) -> Bool) -> Logger[FilterSink[S]] {
{
min_level: self.min_level,
+6
View File
@@ -7,6 +7,12 @@ pub fn field(key : String, value : String) -> Field {
{ key, value }
}
pub fn fields(entries : Array[(String, String)]) -> Array[Field] {
entries.map(fn(entry) {
field(entry.0, entry.1)
})
}
pub struct Record {
level : Level
timestamp_ms : UInt64