From 03daea46e78dfa97d3e4f85fa8035fef5c5ed446 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 16 Jun 2024 21:08:26 +0200 Subject: [PATCH] Added serilog enricher --- DotBased.Logging.Serilog/BasedSerilog.cs | 27 +++++++++++++++++++ ...rilogAdapter.cs => BasedSerilogAdapter.cs} | 21 +++++---------- .../BasedSerilogEnricher.cs | 25 +++++++++++++++++ 3 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 DotBased.Logging.Serilog/BasedSerilog.cs rename DotBased.Logging.Serilog/{SerilogAdapter.cs => BasedSerilogAdapter.cs} (79%) create mode 100644 DotBased.Logging.Serilog/BasedSerilogEnricher.cs diff --git a/DotBased.Logging.Serilog/BasedSerilog.cs b/DotBased.Logging.Serilog/BasedSerilog.cs new file mode 100644 index 0000000..7586298 --- /dev/null +++ b/DotBased.Logging.Serilog/BasedSerilog.cs @@ -0,0 +1,27 @@ +using Serilog; + +namespace DotBased.Logging.Serilog; + +public static class BasedSerilog +{ + /// + /// Default output template with the extra properties that can be used for serilog sinks. + /// + public const string OutputTemplate = "[{Timestamp:HH:mm:ss} - {Caller}->{Assembly}] | {Level:u3}] {Message:lj}{NewLine}{Exception}"; + + public static LoggerConfiguration UseBasedExtension(this LoggerConfiguration loggerConfiguration) + { + loggerConfiguration.Enrich.FromLogContext().Enrich.With(new BasedSerilogEnricher()); + return loggerConfiguration; + } + + /// + /// The extra properties this implementation adds to serilog + /// + public static class ExtraProperties + { + public const string AssemblyProp = "Assembly"; + public const string SourceProp = "Source"; + public const string CallerProp = "Caller"; + } +} \ No newline at end of file diff --git a/DotBased.Logging.Serilog/SerilogAdapter.cs b/DotBased.Logging.Serilog/BasedSerilogAdapter.cs similarity index 79% rename from DotBased.Logging.Serilog/SerilogAdapter.cs rename to DotBased.Logging.Serilog/BasedSerilogAdapter.cs index b79a882..7d2e3e1 100755 --- a/DotBased.Logging.Serilog/SerilogAdapter.cs +++ b/DotBased.Logging.Serilog/BasedSerilogAdapter.cs @@ -7,27 +7,18 @@ using Serilog.Parsing; namespace DotBased.Logging.Serilog; -public class SerilogAdapter : LogAdapterBase +public class BasedSerilogAdapter(global::Serilog.ILogger serilogLogger) : LogAdapterBase("Serilog adapter") { - public SerilogAdapter(global::Serilog.ILogger serilogLogger) : base("Serilog adapter") - { - _serilogLogger = serilogLogger; - _messageTemplateParser = new MessageTemplateParser(); - } - - public const string SampleTemplate = "[{Timestamp:HH:mm:ss} - {Caller}] | {Level:u3}] {Message:lj}{NewLine}{Exception}"; - - private readonly global::Serilog.ILogger _serilogLogger; - private readonly MessageTemplateParser _messageTemplateParser; + private readonly MessageTemplateParser _messageTemplateParser = new(); public override void HandleLog(object? processor, LogCapsule? capsule) { if (capsule == null) return; - var logger = _serilogLogger - .ForContext("Assembly", capsule.Logger.Caller.AssemblyName) - .ForContext("Source", capsule.Logger.Caller.Source) - .ForContext("Caller", capsule.Logger.Caller.Name); + var logger = serilogLogger + .ForContext(BasedSerilog.ExtraProperties.AssemblyProp, capsule.Logger.Caller.AssemblyName) + .ForContext(BasedSerilog.ExtraProperties.SourceProp, capsule.Logger.Caller.Source) + .ForContext(BasedSerilog.ExtraProperties.CallerProp, capsule.Logger.Caller.Name); var template = _messageTemplateParser.Parse(capsule.Message); IEnumerable? properties = null; diff --git a/DotBased.Logging.Serilog/BasedSerilogEnricher.cs b/DotBased.Logging.Serilog/BasedSerilogEnricher.cs new file mode 100644 index 0000000..c6dcd15 --- /dev/null +++ b/DotBased.Logging.Serilog/BasedSerilogEnricher.cs @@ -0,0 +1,25 @@ +using Serilog.Core; +using Serilog.Events; + +namespace DotBased.Logging.Serilog; + +public class BasedSerilogEnricher : ILogEventEnricher +{ + public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) + { + var asmPropValue = "ASM"; + var sourcePropValue = "Unknown"; + if (logEvent.Properties.TryGetValue("SourceContext", out var sourceContextValue)) + asmPropValue = sourceContextValue.ToString().Replace("\"", ""); + if (logEvent.Properties.TryGetValue("Application", out var appValue)) + sourcePropValue = appValue.ToString().Replace("\"", ""); + + var assemblyProperty = propertyFactory.CreateProperty(BasedSerilog.ExtraProperties.AssemblyProp, asmPropValue); + var sourceProperty = propertyFactory.CreateProperty(BasedSerilog.ExtraProperties.SourceProp, sourcePropValue); + var callerProperty = propertyFactory.CreateProperty(BasedSerilog.ExtraProperties.CallerProp, sourcePropValue); + + logEvent.AddPropertyIfAbsent(assemblyProperty); + logEvent.AddPropertyIfAbsent(sourceProperty); + logEvent.AddPropertyIfAbsent(callerProperty); + } +} \ No newline at end of file