Files
BitLogger/src/logger.mbt
T
2026-07-17 15:53:21 +08:00

120 lines
2.3 KiB
MoonBit

///|
pub struct Logger[S] {
min_level : Level
sink : S
target : String
timestamp : Bool
}
///|
pub fn[S] Logger::new(
sink : S,
min_level? : Level = Level::Info,
target? : String = "",
) -> Logger[S] {
{ min_level, sink, target, timestamp: false }
}
///|
pub fn[S] Logger::with_target(self : Logger[S], target : String) -> Logger[S] {
{ ..self, target, }
}
///|
fn combine_targets(parent : String, child : String) -> String {
if parent == "" {
child
} else if child == "" {
parent
} else {
"\{parent}.\{child}"
}
}
///|
pub fn[S] Logger::child(self : Logger[S], target : String) -> Logger[S] {
{ ..self, target: combine_targets(self.target, target) }
}
///|
pub fn[S] Logger::with_context_fields(
self : Logger[S],
fields : Array[Field],
) -> Logger[ContextSink[S]] {
{
min_level: self.min_level,
sink: context_sink(self.sink, fields),
target: self.target,
timestamp: self.timestamp,
}
}
///|
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,
sink: filter_sink(self.sink, predicate),
target: self.target,
timestamp: self.timestamp,
}
}
///|
pub fn[S] Logger::with_patch(
self : Logger[S],
patch : RecordPatch,
) -> Logger[PatchSink[S]] {
{
min_level: self.min_level,
sink: patch_sink(self.sink, patch),
target: self.target,
timestamp: self.timestamp,
}
}
///|
pub fn[S] Logger::with_queue(
self : Logger[S],
max_pending? : Int = 0,
overflow? : QueueOverflowPolicy = QueueOverflowPolicy::DropNewest,
) -> Logger[QueuedSink[S]] {
{
min_level: self.min_level,
sink: queued_sink(self.sink, max_pending~, overflow~),
target: self.target,
timestamp: self.timestamp,
}
}
///|
pub fn[S] Logger::with_min_level(
self : Logger[S],
min_level : Level,
) -> Logger[S] {
{ ..self, min_level, }
}
///|
pub fn[S] Logger::with_timestamp(
self : Logger[S],
enabled? : Bool = true,
) -> Logger[S] {
{ ..self, timestamp: enabled }
}
///|
pub fn[S] Logger::is_enabled(self : Logger[S], level : Level) -> Bool {
level.enabled(self.min_level)
}