
Routing.pudu
Pudu38 lines1.5 KB
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 Value131415fn 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