🔊 Update 1.0.0

This commit is contained in:
Nanaloveyuki
2026-06-27 10:45:36 +08:00
parent 7557e37cc8
commit c8023b0ded
55 changed files with 5734 additions and 2360 deletions
+74 -32
View File
@@ -1,10 +1,14 @@
///|
fn main {
let preset_logger = @lib.build_logger(
@lib.with_queue(
@lib.text_console(
min_level=@lib.Level::Info,
target="preset",
text_formatter=@lib.TextFormatterConfig::new(show_timestamp=false, separator=" | "),
text_formatter=@lib.TextFormatterConfig::new(
show_timestamp=false,
separator=" | ",
),
),
max_pending=2,
overflow=@lib.QueueOverflowPolicy::DropOldest,
@@ -20,8 +24,11 @@ fn main {
@lib.info("hello from BitLogger", fields=[@lib.field("mode", "demo")])
// Direct Logger::new(...) composition stays useful for custom sink graphs.
let logger = @lib.Logger::new(@lib.console_sink(), min_level=@lib.Level::Trace, target="custom")
.with_context_fields([@lib.field("service", "bitlogger")])
let logger = @lib.Logger::new(
@lib.console_sink(),
min_level=@lib.Level::Trace,
target="custom",
).with_context_fields([@lib.field("service", "bitlogger")])
logger.debug("custom logger ready", fields=[@lib.field("sink", "console")])
let bound_logger = @lib.Logger::new(
@@ -31,7 +38,11 @@ fn main {
).bind(@lib.fields([("service", "bitlogger"), ("scope", "audit")]))
bound_logger.info("bound logger ready", fields=[@lib.field("mode", "demo")])
let json_logger = @lib.Logger::new(@lib.json_console_sink(), min_level=@lib.Level::Info, target="json")
let json_logger = @lib.Logger::new(
@lib.json_console_sink(),
min_level=@lib.Level::Info,
target="json",
)
json_logger.info("json output", fields=[@lib.field("kind", "example")])
let fanout_logger = @lib.Logger::new(
@@ -55,12 +66,18 @@ fn main {
split_logger.info("normal output")
split_logger.warn("warning output")
let timed_logger = @lib.Logger::new(@lib.console_sink(), min_level=@lib.Level::Info, target="timed")
.with_timestamp()
let timed_logger = @lib.Logger::new(
@lib.console_sink(),
min_level=@lib.Level::Info,
target="timed",
).with_timestamp()
timed_logger.info("timestamp enabled", fields=[@lib.field("kind", "time")])
let child_logger = @lib.Logger::new(@lib.console_sink(), min_level=@lib.Level::Info, target="app")
.child("worker")
let child_logger = @lib.Logger::new(
@lib.console_sink(),
min_level=@lib.Level::Info,
target="app",
).child("worker")
child_logger.info("child target ready")
let callback_logger = @lib.Logger::new(
@@ -90,8 +107,8 @@ fn main {
color_mode=@lib.ColorMode::Always,
).with_style_tags(
@lib.default_style_tag_registry()
.set_tag("accent", fg=Some("#4cc9f0"), bold=true)
.define_alias("danger", "red"),
.set_tag("accent", fg=Some("#4cc9f0"), bold=true)
.define_alias("danger", "red"),
)
let styled_logger = @lib.Logger::new(
@lib.text_console_sink(styled_formatter),
@@ -109,25 +126,36 @@ fn main {
min_level=@lib.Level::Info,
target="file",
)
file_logger.info("native file sink ready", fields=[@lib.field("kind", "file")])
file_logger.info("native file sink ready", fields=[
@lib.field("kind", "file"),
])
ignore(file_logger.sink.flush())
ignore(file_logger.sink.close())
}
let buffered = @lib.buffered_sink(@lib.console_sink(), flush_limit=2)
let buffered_logger = @lib.Logger::new(buffered, min_level=@lib.Level::Info, target="buffered")
let buffered_logger = @lib.Logger::new(
buffered,
min_level=@lib.Level::Info,
target="buffered",
)
buffered_logger.info("buffered one")
buffered_logger.info("buffered two")
buffered.flush()
let filtered = @lib.filter_sink(
@lib.console_sink(),
fn(rec) {
rec.target == "kept"
},
let filtered = @lib.filter_sink(@lib.console_sink(), fn(rec) {
rec.target == "kept"
})
let kept_logger = @lib.Logger::new(
filtered,
min_level=@lib.Level::Info,
target="kept",
)
let dropped_logger = @lib.Logger::new(
filtered,
min_level=@lib.Level::Info,
target="dropped",
)
let kept_logger = @lib.Logger::new(filtered, min_level=@lib.Level::Info, target="kept")
let dropped_logger = @lib.Logger::new(filtered, min_level=@lib.Level::Info, target="dropped")
kept_logger.info("filter kept this")
dropped_logger.info("filter dropped this")
@@ -135,10 +163,12 @@ fn main {
@lib.console_sink(),
min_level=@lib.Level::Info,
target="service",
).with_filter(@lib.all_of([
@lib.target_has_prefix("service"),
@lib.message_contains("kept"),
]))
).with_filter(
@lib.all_of([
@lib.target_has_prefix("service"),
@lib.message_contains("kept"),
]),
)
filtered_logger.info("logger filter dropped this")
filtered_logger.child("api").info("logger filter kept this")
@@ -146,12 +176,17 @@ fn main {
@lib.console_sink(),
min_level=@lib.Level::Info,
target="auth",
).with_patch(@lib.compose_patches([
@lib.prefix_message("[safe] "),
@lib.redact_fields(["token"]),
@lib.append_fields([@lib.field("service", "bitlogger")]),
]))
patched_logger.info("login", fields=[@lib.field("user", "alice"), @lib.field("token", "secret")])
).with_patch(
@lib.compose_patches([
@lib.prefix_message("[safe] "),
@lib.redact_fields(["token"]),
@lib.append_fields([@lib.field("service", "bitlogger")]),
]),
)
patched_logger.info("login", fields=[
@lib.field("user", "alice"),
@lib.field("token", "secret"),
])
let config_logger = @lib.parse_and_build_logger(
"{\"min_level\":\"debug\",\"target\":\"config.demo\",\"timestamp\":true,\"sink\":{\"kind\":\"text_console\",\"text_formatter\":{\"show_timestamp\":false,\"field_separator\":\",\",\"template\":\"[{level}] {target} {message} :: {fields}\"}},\"queue\":{\"max_pending\":2,\"overflow\":\"DropOldest\"}}",
@@ -165,7 +200,10 @@ fn main {
config_logger.info("configured from json")
ignore(config_logger.flush())
let queue_config = @lib.QueueConfig::new(4, overflow=@lib.QueueOverflowPolicy::DropOldest)
let queue_config = @lib.QueueConfig::new(
4,
overflow=@lib.QueueOverflowPolicy::DropOldest,
)
println(@lib.stringify_queue_config(queue_config))
let formatter_config = @lib.TextFormatterConfig::new(
@@ -195,13 +233,17 @@ fn main {
let file_runtime_logger = @lib.build_logger(
@lib.LoggerConfig::new(
sink=@lib.SinkConfig::new(kind=@lib.SinkKind::File, path="bitlogger-runtime-demo.log"),
sink=@lib.SinkConfig::new(
kind=@lib.SinkKind::File,
path="bitlogger-runtime-demo.log",
),
queue=Some(@lib.QueueConfig::new(8)),
),
)
file_runtime_logger.info("runtime file logger ready")
match file_runtime_logger.file_runtime_state() {
Some(snapshot) => println(@lib.stringify_runtime_file_state(snapshot, pretty=true))
Some(snapshot) =>
println(@lib.stringify_runtime_file_state(snapshot, pretty=true))
None => ()
}
ignore(file_runtime_logger.file_close())