Native structured logging with levels and category-based filtering.
Dependencies
if @xlog.info(category="app") is Some(event) {
event.write_object_begin()
event.write_object_field("message", "server started")
event.write_object_field("port", 8080)
event.write_object_end()
}let logger = @xlog.Logger(@xlog.Stdout())
if logger.debug(category="app.db") is Some(event) {
event.write_object_begin()
event.write_object_field("message", "query plan")
event.write_object_end()
}Fatal Error Warn Info Debug Tracelet logger = @xlog.Logger(@xlog.Stdout())
if logger.info(category="app") is Some(event) {
event.write_object_begin()
event.write_object_field("message", "server started")
event.write_object_end()
}MOON_XLOG=debug
MOON_XLOG='warn,app.db=debug,app.db.query=trace'let config = @xlog.Config(level=@xlog.Warn)
config.set_category_level("app.db", @xlog.Debug)
let logger = @xlog.Logger(@xlog.Stdout(), config~)
if logger.debug(category="app.db") is Some(event) {
event.write_object_begin()
event.write_object_field("message", "query plan")
event.write_object_end()
}@xlog.global().set_handler(@xlog.Stdout())
@xlog.global().set_handler(@xlog.Stdout(format=@xlog.Text))let file = @xlog.File("_build/app.log")
@xlog.global().set_handler(file)
if @xlog.info(category="app") is Some(event) {
event.write_object_begin()
event.write_object_field("message", "written to file")
event.write_object_end()
}let file = @xlog.File("_build/app.log")
let handlers : Array[&@xlog.Handler] = [@xlog.Stdout(), file]
@xlog.global().set_handler(@xlog.Multi(handlers))let config = @xlog.Config::from_env() catch { _ => @xlog.Config() }
@xlog.global().set_config(config)
@xlog.global().set_level(@xlog.Debug)
if @xlog.info(category="app") is Some(event) {
event.write_object_begin()
event.write_object_field("message", "top-level record")
event.write_object_end()
}moon run examples/lorem
MOON_XLOG=debug moon run examples/lorem
MOON_XLOG='warn,lorem.db=trace,lorem.worker=debug,lorem.parser.lexer=trace' moon run examples/lorempub(all) suberror ConfigError {
InvalidCategory(String)
InvalidDirective(String)
InvalidLevel(String)
}type Configfn Config::set_category_level(self : Config, category : String, level : Level) -> Unit raise ConfigErrorpub struct Entry {
level : Level
category : String?
timestamp : ZonedDateTime
source : SourceLoc?
fields : Map[String, Json]
}type Eventtype Filetype Loggertype StdoutNative structured logging with levels and category-based filtering.
Dependencies