Skip to content

Logging

1 min read

Logging records events while your app runs. Give each logger a name, choose a minimum severity, and add handlers to send records to the console, a file, or your own destination.

Import: import system.logging;

Named loggers, levels, and handlers (console or file).

import system;
import system.logging;

fun main() {
    let log = Logger.get("app");
    log.add_handler(ConsoleHandler());
    log.level = LogLevel.Debug;
    log.info("ready");
}

Levels, low to high: Trace, Debug, Info, Warn, Error. Records below the logger’s level are dropped. level_name(LogLevel.Info) is "Info".

Call Meaning
Logger.get(name) shared logger by name
Logger(name) a new logger
log.level minimum level
add_handler(handler) where records go
trace / debug / info / warn / error(msg) emit

Handlers: ConsoleHandler(), FileHandler(path), or your own LogHandler.emit(record).

Write your own handler

A LogHandler implements emit(record: LogRecord): void. Each record has four public fields:

Field Type Meaning
level LogLevel Severity of this event
name string Name of the logger that produced it
message string Event text
timestamp_ms long UTC milliseconds since the Unix epoch
import system;
import system.logging;

class ShortHandler: LogHandler {
    public fun emit(record: LogRecord): void {
        System.println(record.name + ": " + record.message);
    }
}

fun main() {
    let logger = Logger("app");
    logger.add_handler(ShortHandler());
    logger.info("ready");
}

This prints app: ready. Choose Logger(name) for a new logger or Logger.get(name) to reuse a named logger. Avoid logging credentials or private data in either kind of handler.

See LogRecord, LogHandler, and Logger for all declarations.