Developer Tools
vlog
Structured logging: one line per entry, with a timestamp, a level and fields.
Released v1.0.0 · 2026-09-28use "stdlib/log.ven"
So a program can explain itself later.
l = logger("myapp")
print l.min_level
:: 0
Reference (12 functions)
API reference
logger(name)
Builds a new Logger with the given name, no minimum level, and no context fields.
l = logger("myapp")
print l.min_level
:: prints: 0level_number(level_name)
Converts a level name to its numeric level, or raises when the name is unknown.
print level_number("warning")
:: prints: 2level_name_of(level_num)
Converts a numeric level back to its printed name.
print level_name_of(2)
:: prints: WARNINGset_minimum_level(l, level_name)
Raises ls minimum emitted level, filtering out anything below it.
l = logger("myapp")
set_minimum_level(l, "warning")
print l.min_level
:: prints: 2merged_map(base, overrides)
Builds a new Map holding bases entries overlaid with overridess.
base = new_map()
map_set(base, "a", 1)
overrides = new_map()
map_set(overrides, "a", 2)
map_set(overrides, "b", 3)
print json_encode(merged_map(base, overrides))
:: prints: {"a": 2, "b": 3}with_context(l, fields)
Returns a new Logger with fields merged on top of ls existing context.
l = logger("myapp")
fields = new_map()
map_set(fields, "region", "us")
l2 = with_context(l, fields)
print json_encode(l2.context)
:: prints: {"region": "us"}log_entry_text(l, level_num, message, fields)
Builds the exact one-line text of a log entry, without printing it.
l = logger("myapp")
print log_entry_text(l, 1, "started", new_map())
:: prints: 2026-09-13T20:44:32Z INFO myapp: started {}emit_log(l, level_num, message, fields)
Prints one entry through l, but only when its level meets ls minimum.
l = logger("myapp")
emit_log(l, 1, "started", new_map())
:: prints: 2026-09-13T20:44:32Z INFO myapp: started {}debug(l, message, fields)
l = logger("myapp")
set_minimum_level(l, "info")
debug(l, "hidden", new_map())
info(l, "started", new_map())
:: prints: 2026-09-13T20:44:32Z INFO myapp: started {}info(l, message, fields)
l = logger("myapp")
info(l, "started", new_map())
:: prints: 2026-09-13T20:44:32Z INFO myapp: started {}warning(l, message, fields)
l = logger("myapp")
warning(l, "low disk", new_map())
:: prints: 2026-09-13T20:44:32Z WARNING myapp: low disk {}error(l, message, fields)
l = logger("myapp")
error(l, "boom", new_map())
:: prints: 2026-09-13T20:44:32Z ERROR myapp: boom {}