Simplify CHANGELOG format
结构化日志库 — CCF OSC2026 MoonBit 赛道参赛作品
moon check --deny-warn
moon test
Debug, Info, Warn, Error, Fatal, Audit
text, compact, json, audit(分隔符), logfmt, xml, pretty(ANSI彩色), kv(key=value), banner(横幅), csv, pattern(模式), stats(统计), multi_line(缩进), custom(自定义)
LogConfig
g_debug / g_info / g_warn / g_error / g_fatal / g_log / g_log_with init_default_console() / init_default_json()
g_debug
g_info
g_warn
g_error
g_fatal
g_log
g_log_with
init_default_console()
init_default_json()
# 编译检查(零警告) moon check --target all --deny-warn # 运行全部 163 个测试 moon test --target all # 格式化代码 moon fmt # 构建 WASM-GC moon build --target wasm-gc --release # 构建 JS moon build --target js --release
在 moon.pkg 中添加依赖:
moon.pkg
import { "leppard/moonbit-log" @log }
在 moon.mod 中添加:
moon.mod
[deps] leppard/moonbit-log = { version = "1.0.0" }
fn main { @log.init_default_console() @log.g_info("Hello, moonbit-log!") @log.g_info("User login", [("user_id", "42"), ("ip", "10.0.0.1")]) }
@log.init_default_json() @log.g_info("Order created", [ ("order_id", "ORD-001"), ("amount", "299.00"), ("currency", "CNY") ])
let fmt = @log.audit_formatter("|") let audit = @log.AuditHandler::new(@log.Level::Info, fmt, 100) let logger = @log.Logger::new() logger.add_handler(@log.make_handler(fn(e) { audit.log(e) }, fn() {}, fn() {})) logger.log_with(@log.Level::Info, "数据导出", [("user", "admin"), ("records", "1000")]) println(audit.entries().length())
let handler = @log.FileHandler::new( @log.Level::Info, @log.json_formatter(), 100 ) let logger = @log.Logger::new() logger.add_handler(@log.make_handler(fn(e) { handler.log(e) }, fn() { handler.flush() }, fn() { handler.close() })) logger.info("写入缓冲")
let handler = @log.RotatingFileHandler::new( @log.Level::Info, @log.text_formatter(), 10, 5 ) let logger = @log.Logger::new() logger.add_handler(@log.make_handler(fn(e) { handler.log(e) }, fn() { handler.flush() }, fn() { handler.close() })) // 超过 10 行自动轮转,保留 5 个历史文件
let handler = @log.ConsoleHandler::new(@log.Level::Debug, @log.compact_formatter()) let batch = @log.AsyncLogger::new( @log.make_handler(fn(e) { handler.log(e) }, fn() { handler.flush() }, fn() { handler.close() }), 64 ) batch.log(@log.LogEntryBuilder::new(@log.Level::Info, "异步消息").build()) batch.flush()
let r = @log.benchmark("计算测试", 1000, fn() { let mut x = 0 x = x + 1 @log.ignore(x) }) println(@log.benchmark_report(r))
@log.configure( level: @log.Level::Debug, format: "compact", output: "console" ) @log.g_debug("配置已生效")
new()
Logger
add_handler(HandlerFn)
Unit
debug/info/warn/error/fatal(msg, fields?)
log_with(Level, msg, fields?)
set_level(Level)
每个 Handler 实现三个方法:
log(self, LogEntry) -> Unit
flush(self) -> Unit
close(self) -> Unit
Stopwatch
elapsed_ms()
Int64
elapsed_us()
elapsed_s()
Double
lap(msg)
reset()
laps()
Array[(String, Int64)]
report()
String
level
Level
message
fields
Array[(String, String)]
timestamp
module
file
line
Int
moonbit-log/ ├── logger.mbt # Logger 核心 ├── log_entry.mbt # LogEntry / LogEntryBuilder ├── level.mbt # Level 枚举 / enabled / from_string ├── handler.mbt # HandlerFn 函数式 Handler ├── formatter.mbt # text / compact / json / audit / custom ├── console_handler.mbt # ConsoleHandler ├── file_handler.mbt # FileHandler (缓冲批量输出) ├── json_handler.mbt # JsonHandler ├── text_handler.mbt # TextHandler (带前缀) ├── memory_handler.mbt # MemoryHandler (内存存储+检索) ├── audit_handler.mbt # AuditHandler (审计日志) ├── multi_handler.mbt # MultiHandler (多路分发) ├── advanced_handlers.mbt # RotatingFile / LevelFilter / Sampling / Dedup / RingBuffer / RateLimited ├── extra_handler_utils.mbt # Null / Condition / Throttled / Counting / kv / banner / csv ├── extra_formatters.mbt # logfmt / xml / pretty(ANSI) ├── template_formatter.mbt # pattern / stats / multi_line ├── async_logger.mbt # AsyncLogger / BatchingLogger / EntryTransformer ├── config.mbt # LogConfig + 工厂方法 + JSON 配置 ├── global_logger.mbt # 全局 Logger 单例 ├── stopwatch.mbt # Stopwatch / Benchmark / ThroughputMeter ├── entry_utils.mbt # 条目工具函数 ├── log_test.mbt # 基础测试 (~50 用例) ├── extended_test.mbt # 扩展测试 (~50 用例) ├── edge_case_test.mbt # 边界情况测试 (~63 用例) ├── cmd/example/main.mbt # CLI 示例 ├── moon.mod # 模块元数据 └── moon.pkg # 包配置
Apache-2.0
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
moonbit-log
结构化日志库 — CCF OSC2026 MoonBit 赛道参赛作品
Project Status
moon check --deny-warn通过moon test163/163 通过Features
日志级别 (6)
Debug, Info, Warn, Error, Fatal, Audit
处理器 (21)
格式器 (14)
text, compact, json, audit(分隔符), logfmt, xml, pretty(ANSI彩色), kv(key=value), banner(横幅), csv, pattern(模式), stats(统计), multi_line(缩进), custom(自定义)
性能工具
配置系统
LogConfig+ Builder 模式 + 工厂方法全局 Logger
g_debug/g_info/g_warn/g_error/g_fatal/g_log/g_log_withinit_default_console()/init_default_json()Build & Test
Quick Start
在
moon.pkg中添加依赖:在
moon.mod中添加:基本使用
JSON 日志
审计日志
文件/缓冲输出
文件轮转
异步批处理
性能基准
配置系统
API Reference
Logger
new()Loggeradd_handler(HandlerFn)Unitdebug/info/warn/error/fatal(msg, fields?)Unitlog_with(Level, msg, fields?)Unitset_level(Level)UnitHandler 通用接口
每个 Handler 实现三个方法:
log(self, LogEntry) -> Unit— 记录日志条目flush(self) -> Unit— 刷新缓冲close(self) -> Unit— 关闭并释放资源Stopwatch
new()Stopwatchelapsed_ms()Int64elapsed_us()Int64elapsed_s()Doublelap(msg)Int64reset()Unitlaps()Array[(String, Int64)]report()StringLogEntry
levelLevelmessageStringfieldsArray[(String, String)]timestampInt64moduleStringfileStringlineIntProject Structure
竞品对比
License
Apache-2.0
参赛信息