Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-log

Structured event logging for Pudu: message templates, enrichment, filtering, formatting, and sinks

0.1.0Apache-2.01

InstallClose

Routing.pudu

Pudu38 lines1.5 KB

GitHub ↗
1/** @Example.Routing.Program — one sink per tenant and a live observer */2module Routing34import Std.Io as Io5import PuduLangLog.Configuration as Configuration6import PuduLangLog as Log7import PuduLangLog.Logger as Logger8import PuduLangLog.Sink as Sink9import PuduLangLog.Sinks.Map as Map10import PuduLangLog.Sinks.Memory as Memory11import PuduLangLog.Sinks.Observable as Observable12import PuduLangLog.Value as Value1314/// Routes events by tenant, keeps at most two tenant sinks open, watches warnings, and answers 0.15fn main() -> Int {16  let store = Memory.create()17  let perTenant = Map.sink(Map.Options {18      ..Map.defaults(Map.byProperty("Tenant", "none"), fn(tenant: Str) -> Sink.Sink {19          let _opened = Io.writeLine("opened a sink for " + tenant)20          Memory.sink(&store)21        }),22      limit: Some(2)23    })24  let watched = Observable.create()25  let _subscription = Observable.subscribe(&watched, Observable.Observer {26      next: fn(event: &Log.Event) -> () { if event.level == Log.Warning { let _seen = Io.writeLine("observed a warning: " + event.template.text) } },27      completed: fn() -> () { let _done = Io.writeLine("observer finished") }28    })29  let logger = Configuration.create().writeTo(perTenant).writeTo(Observable.sink(&watched)).createLogger()30  for tenant in ["north", "south", "north", "east", "south"] {31    logger.forContext("Tenant", Value.text(tenant)).information("Request for \{Tenant\}", [])32  }33  logger.warning("Disk almost full", [])34  Logger.close(&logger)35  let _counted = Io.writeLine(show(Memory.events(&store).length()) + " events stored")36  037}38