1/** @Log.Bridge.Adapter — standard library log lines written as events */2modulePuduLangLog.Bridge34importStd.LogasStandard5importStd.OptionasOption6importStd.OutasOut7importPuduLangLog.Constants.NamesasNames8importPuduLangLog.Domain.ParserasParser9importPuduLangLogasLog10importPuduLangLog.LoggerasLogger11importPuduLangLog.PipelineasPipeline1213/// A `Std.Log` logger whose lines become events of this logger: `Debug` through `Fatal` keep their14/// meaning, the logger's name becomes `SourceContext`, each field a text property, and the message15/// the event's text with its braces escaped. The standard logger prints nothing itself; which lines16/// are kept is this logger's decision.17exportfnstandard(logger: &Logger.Logger) -> Standard.Logger {18let shared = *logger19Standard.Logger {20 least: Standard.Debug,21 name: "",22 fields: [],23 format: fn(line: Standard.Line) -> Str {24 forward(&shared, &line)25""26 },27 printer: Out.bare()28 }29}3031/// The level of a standard line; `Silent` lines are never formatted.32exportfnlevelOf(level: Standard.Level) -> Log.Level {33match level {34caseStandard.Debug => Log.Debug35caseStandard.Info => Log.Information36caseStandard.Warn => Log.Warning37caseStandard.Error => Log.Error38case _ => Log.Fatal39 }40}4142/// Writes a standard line as an event.43fnforward(logger: &Logger.Logger, line: &Standard.Line) -> () {44let named = if line.name.isEmpty() { *logger } else { logger.forSource(line.name) }45let level = levelOf(line.level)46if !named.isEnabled(level) { return () }47let pipeline = Logger.pipelineOf(&named)48var properties: Array[Log.Property] = []49for field in line.fields {50ifParser.isValidName(field.key) && field.key != Names.SOURCE_CONTEXT { properties = properties.push(Log.Property{name: field.key, value: Log.Scalar(Log.Text(field.value))}) }51 }52let text = line.message.replace("\{", "\{\{").replace("\}", "\}\}")53let _written = named.emit(Log.Event {54 timestamp: (pipeline.clock)(),55 level: level,56 template: Pipeline.templateOf(&pipeline, text),57 properties: properties,58 failure: None,59 traceId: Option.map(named.trace, |pair: (Str, Str)| pair[0]),60 spanId: Option.map(named.trace, |pair: (Str, Str)| pair[1])61 })62}63