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

Event.pudu

Pudu51 lines2.2 KB

GitHub ↗
1/** @Log.Event.Access — building, reading, and changing events */2module PuduLangLog.Event34import PuduLangLog.Constants.Names as Names5import PuduLangLog.Domain.Display as Display6import PuduLangLog.Domain.Parser as Parser7import PuduLangLog.Domain.Properties as Properties8import PuduLangLog as Log910/// An event from its parts, with no failure, trace, or span.11export fn create(timestamp: Log.Timestamp, level: Log.Level, template: Str, properties: Array[Log.Property]) -> Log.Event {12  Log.Event{timestamp: timestamp, level: level, template: Parser.parse(template), properties: properties, failure: None, traceId: None, spanId: None}13}1415/// The message: the template rendered with the event's properties.16export fn message(event: &Log.Event) -> Str { Display.plain(&Display.message(&event.template, &event.properties, &None)) }1718/// The value of a property.19export fn property(event: &Log.Event, name: Str) -> Option[Log.Value] { Properties.find(&event.properties, name) }2021/// The source context, when the event carries one as text.22export fn sourceContext(event: &Log.Event) -> Option[Str] {23  match property(event, Names.SOURCE_CONTEXT) {24    case Some(Log.Scalar(Log.Text(source))) => Some(source)25    case _ => None26  }27}2829/// The event with a property set, replacing any value it had.30export fn withProperty(event: &Log.Event, name: Str, held: Log.Value) -> Log.Event {31  Log.Event{..*event, properties: Properties.put(&event.properties, name, held)}32}3334/// The event with a property set unless it already has one of that name.35export fn withPropertyIfAbsent(event: &Log.Event, name: Str, held: Log.Value) -> Log.Event {36  Log.Event{..*event, properties: Properties.putIfAbsent(&event.properties, name, held)}37}3839/// The event without a property.40export fn withoutProperty(event: &Log.Event, name: Str) -> Log.Event {41  Log.Event{..*event, properties: Properties.remove(&event.properties, name)}42}4344/// The event with a failure attached.45export fn withFailure(event: &Log.Event, problem: Log.Failure) -> Log.Event { Log.Event{..*event, failure: Some(problem)} }4647/// The event with a trace and span identifier.48export fn withTrace(event: &Log.Event, traceId: Str, spanId: Str) -> Log.Event {49  Log.Event{..*event, traceId: Some(traceId), spanId: Some(spanId)}50}51