mirror of
https://github.com/Nanaloveyuki/BitLogger.git
synced 2026-05-30 15:42:25 +00:00
✨ Add bind-style context helpers
This commit is contained in:
@@ -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()),
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user