From ed66be3dd9c292dc9a8cc81486d27fdc33450a1e Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Tue, 14 May 2024 22:17:01 -0500 Subject: [PATCH 01/10] fix: LogError message forwards to LogMessage Console overload with ErrorLogLevel parameter also forwards directly to LogMessage and skips LogError method --- src/Pepperdash Core/Logging/Debug.cs | 39 ++++------------------------ 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/src/Pepperdash Core/Logging/Debug.cs b/src/Pepperdash Core/Logging/Debug.cs index 1cf916a..5db28a6 100644 --- a/src/Pepperdash Core/Logging/Debug.cs +++ b/src/Pepperdash Core/Logging/Debug.cs @@ -187,7 +187,7 @@ namespace PepperDash.Core CrestronConsole.PrintLine(msg); - LogError(ErrorLogLevel.Notice, msg); + LogMessage(LogEventLevel.Information,msg); IncludedExcludedKeys = new Dictionary(); @@ -691,25 +691,8 @@ namespace PepperDash.Core [Obsolete("Use LogMessage methods")] public static void Console(uint level, IKeyed dev, ErrorLogLevel errorLogLevel, string format, params object[] items) - { - - var str = string.Format("[{0}] {1}", dev.Key, string.Format(format, items)); - if (errorLogLevel != ErrorLogLevel.None) - { - LogError(errorLogLevel, str); - } - + { LogMessage(level, dev, format, items); - - //var log = _logger.ForContext("Key", dev.Key); - //var message = string.Format(format, items); - - //log.Write((LogEventLevel)level, message); - - //if (Level >= level) - //{ - // Console(level, str); - //} } /// @@ -719,17 +702,7 @@ namespace PepperDash.Core public static void Console(uint level, ErrorLogLevel errorLogLevel, string format, params object[] items) { - var str = string.Format(format, items); - if (errorLogLevel != ErrorLogLevel.None) - { - LogError(errorLogLevel, str); - } - LogMessage(level, format, items); - //if (Level >= level) - //{ - // Console(level, str); - //} } /// @@ -770,18 +743,16 @@ namespace PepperDash.Core [Obsolete("Use LogMessage methods")] public static void LogError(ErrorLogLevel errorLogLevel, string str) { - - var msg = IsRunningOnAppliance ? string.Format("App {0}:{1}", InitialParametersClass.ApplicationNumber, str) : string.Format("Room {0}:{1}", InitialParametersClass.RoomId, str); switch (errorLogLevel) { case ErrorLogLevel.Error: - ErrorLog.Error(msg); + LogMessage(LogEventLevel.Error, str); break; case ErrorLogLevel.Warning: - ErrorLog.Warn(msg); + LogMessage(LogEventLevel.Warning, str); break; case ErrorLogLevel.Notice: - ErrorLog.Notice(msg); + LogMessage(LogEventLevel.Information, str); break; } } From 2e8edfc395c74362929f0803fb7aa3d27bfd4d61 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Tue, 14 May 2024 22:29:14 -0500 Subject: [PATCH 02/10] feat: add IKeyed extensions for logging --- .../Logging/DebugExtensions.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/Pepperdash Core/Logging/DebugExtensions.cs diff --git a/src/Pepperdash Core/Logging/DebugExtensions.cs b/src/Pepperdash Core/Logging/DebugExtensions.cs new file mode 100644 index 0000000..e37e6d9 --- /dev/null +++ b/src/Pepperdash Core/Logging/DebugExtensions.cs @@ -0,0 +1,39 @@ +using Serilog; +using Serilog.Events; +using Log = PepperDash.Core.Debug; + +namespace PepperDash.Core.Logging +{ + public static class DebugExtensions + { + public static void LogVerbose(this IKeyed device, string message, params object[] args) + { + Log.LogMessage(LogEventLevel.Verbose, device, message, args); + } + + public static void LogDebug(this IKeyed device, string message, params object[] args) + { + Log.LogMessage(LogEventLevel.Debug, device, message, args); + } + + public static void LogInformation(this IKeyed device, string message, params object[] args) + { + Log.LogMessage(LogEventLevel.Information, device, message, args); + } + + public static void LogWarning(this IKeyed device, string message, params object[] args) + { + Log.LogMessage(LogEventLevel.Warning, device, message, args); + } + + public static void LogError(this IKeyed device, string message, params object[] args) + { + Log.LogMessage(LogEventLevel.Error, device, message, args); + } + + public static void LogFatal(this IKeyed device, string message, params object[] args) + { + Log.LogMessage(LogEventLevel.Fatal, device, message, args); + } + } +} From 5bdd9e02bb0d6654edaf91611fa4b4936d81f7df Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 15 May 2024 15:26:25 -0500 Subject: [PATCH 03/10] feat: Add enricher to automatically add App property to all messages This enricher can be enhanced in the future to add additional properties that we might want without affecting anything else. --- .../Logging/CrestronEnricher.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/Pepperdash Core/Logging/CrestronEnricher.cs diff --git a/src/Pepperdash Core/Logging/CrestronEnricher.cs b/src/Pepperdash Core/Logging/CrestronEnricher.cs new file mode 100644 index 0000000..623530e --- /dev/null +++ b/src/Pepperdash Core/Logging/CrestronEnricher.cs @@ -0,0 +1,38 @@ +using Crestron.SimplSharp; +using Serilog.Core; +using Serilog.Events; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PepperDash.Core.Logging +{ + public class CrestronEnricher : ILogEventEnricher + { + static readonly string _appName; + + static CrestronEnricher() + { + if(CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance) + { + _appName = $"App {InitialParametersClass.ApplicationNumber}"; + return; + } + + if(CrestronEnvironment.DevicePlatform == eDevicePlatform.Server) + { + _appName = $"Room {InitialParametersClass.RoomId}"; + } + } + + + public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) + { + var property = propertyFactory.CreateProperty("App", _appName); + + logEvent.AddOrUpdateProperty(property); + } + } +} From ec2f8ffd927a83fb0997aa816fe1b918a231ae9a Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 15 May 2024 15:26:41 -0500 Subject: [PATCH 04/10] fix: modify how messages are formatted --- src/Pepperdash Core/Logging/Debug.cs | 4 +++- src/Pepperdash Core/Logging/DebugConsoleSink.cs | 12 ++++++++++-- src/Pepperdash Core/PepperDash_Core.csproj | 3 ++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Pepperdash Core/Logging/Debug.cs b/src/Pepperdash Core/Logging/Debug.cs index 5db28a6..2c8ee1e 100644 --- a/src/Pepperdash Core/Logging/Debug.cs +++ b/src/Pepperdash Core/Logging/Debug.cs @@ -10,6 +10,7 @@ using Serilog.Core; using Serilog.Events; using Serilog.Formatting.Compact; using Serilog.Formatting.Json; +using Serilog.Templates; using System; using System.Collections.Generic; using System.Reflection; @@ -146,7 +147,8 @@ namespace PepperDash.Core _defaultLoggerConfiguration = new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.FromLogContext() - .WriteTo.Sink(new DebugConsoleSink(new JsonFormatter(renderMessage: true)), levelSwitch: _consoleLoggingLevelSwitch) + .Enrich.With(new CrestronEnricher()) + .WriteTo.Sink(new DebugConsoleSink(new ExpressionTemplate("[{@t][{@l}][{App}][{Key:3}]{@m}\n{@x}")), levelSwitch: _consoleLoggingLevelSwitch) .WriteTo.Sink(_websocketSink, levelSwitch: _websocketLoggingLevelSwitch) .WriteTo.Sink(new DebugErrorLogSink(), levelSwitch: _errorLogLevelSwitch) .WriteTo.File(new RenderedCompactJsonFormatter(), logFilePath, diff --git a/src/Pepperdash Core/Logging/DebugConsoleSink.cs b/src/Pepperdash Core/Logging/DebugConsoleSink.cs index 990d47b..a6c7f89 100644 --- a/src/Pepperdash Core/Logging/DebugConsoleSink.cs +++ b/src/Pepperdash Core/Logging/DebugConsoleSink.cs @@ -5,6 +5,8 @@ using Serilog.Core; using Serilog.Events; using Serilog.Formatting; using Serilog.Formatting.Json; +using System.IO; +using System.Text; namespace PepperDash.Core @@ -17,12 +19,18 @@ namespace PepperDash.Core { if (!Debug.IsRunningOnAppliance) return; - string message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}]{logEvent.RenderMessage()}"; + /*string message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}]{logEvent.RenderMessage()}"; if(logEvent.Properties.TryGetValue("Key",out var value) && value is ScalarValue sv && sv.Value is string rawValue) { message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}][{rawValue,3}]: {logEvent.RenderMessage()}"; - } + }*/ + + var buffer = new StringWriter(new StringBuilder(256)); + + _textFormatter.Format(logEvent, buffer); + + var message = buffer.ToString(); CrestronConsole.PrintLine(message); } diff --git a/src/Pepperdash Core/PepperDash_Core.csproj b/src/Pepperdash Core/PepperDash_Core.csproj index 2da71dc..0e76202 100644 --- a/src/Pepperdash Core/PepperDash_Core.csproj +++ b/src/Pepperdash Core/PepperDash_Core.csproj @@ -35,8 +35,9 @@ + - + From 14e6aa4dc84125e56724f4aaee35def99c2c9657 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 15 May 2024 15:38:06 -0500 Subject: [PATCH 05/10] fix: missing } --- src/Pepperdash Core/Logging/Debug.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Pepperdash Core/Logging/Debug.cs b/src/Pepperdash Core/Logging/Debug.cs index 2c8ee1e..3555df5 100644 --- a/src/Pepperdash Core/Logging/Debug.cs +++ b/src/Pepperdash Core/Logging/Debug.cs @@ -148,7 +148,7 @@ namespace PepperDash.Core .MinimumLevel.Verbose() .Enrich.FromLogContext() .Enrich.With(new CrestronEnricher()) - .WriteTo.Sink(new DebugConsoleSink(new ExpressionTemplate("[{@t][{@l}][{App}][{Key:3}]{@m}\n{@x}")), levelSwitch: _consoleLoggingLevelSwitch) + .WriteTo.Sink(new DebugConsoleSink(new ExpressionTemplate("[{@t}][{@l}][{App}][{Key:3}]{@m}\n{@x}")), levelSwitch: _consoleLoggingLevelSwitch) .WriteTo.Sink(_websocketSink, levelSwitch: _websocketLoggingLevelSwitch) .WriteTo.Sink(new DebugErrorLogSink(), levelSwitch: _errorLogLevelSwitch) .WriteTo.File(new RenderedCompactJsonFormatter(), logFilePath, From d7f57439c8ee9e7d13ff4cdf793ee66bb6e6d006 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 15 May 2024 23:37:39 -0500 Subject: [PATCH 06/10] refactor: update log message format for console --- src/Pepperdash Core/Logging/Debug.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Pepperdash Core/Logging/Debug.cs b/src/Pepperdash Core/Logging/Debug.cs index 3555df5..a5e49f4 100644 --- a/src/Pepperdash Core/Logging/Debug.cs +++ b/src/Pepperdash Core/Logging/Debug.cs @@ -148,7 +148,7 @@ namespace PepperDash.Core .MinimumLevel.Verbose() .Enrich.FromLogContext() .Enrich.With(new CrestronEnricher()) - .WriteTo.Sink(new DebugConsoleSink(new ExpressionTemplate("[{@t}][{@l}][{App}][{Key:3}]{@m}\n{@x}")), levelSwitch: _consoleLoggingLevelSwitch) + .WriteTo.Sink(new DebugConsoleSink(new ExpressionTemplate("[{@t:yyyy-MM-dd HH:mm:ss.fff}][{@l:u4}][{App}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}")), levelSwitch: _consoleLoggingLevelSwitch) .WriteTo.Sink(_websocketSink, levelSwitch: _websocketLoggingLevelSwitch) .WriteTo.Sink(new DebugErrorLogSink(), levelSwitch: _errorLogLevelSwitch) .WriteTo.File(new RenderedCompactJsonFormatter(), logFilePath, @@ -593,7 +593,7 @@ namespace PepperDash.Core /// Args to put into message template public static void LogMessage(Exception ex, string message, IKeyed device = null, params object[] args) { - using (LogContext.PushProperty("Key", device?.Key ?? string.Empty)) + using (LogContext.PushProperty("Key", device?.Key)) { _logger.Error(ex, message, args); } @@ -608,7 +608,7 @@ namespace PepperDash.Core /// Args to put into message template public static void LogMessage(LogEventLevel level, string message, IKeyed device=null, params object[] args) { - using (LogContext.PushProperty("Key", device?.Key ?? string.Empty)) + using (LogContext.PushProperty("Key", device?.Key)) { _logger.Write(level, message, args); } From e581eede56e93771ff821ca9e60e8df4a3579a05 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 15 May 2024 23:42:31 -0500 Subject: [PATCH 07/10] fix: match error log & console formats --- src/Pepperdash Core/Logging/Debug.cs | 2 +- .../Logging/DebugErrorLogSink.cs | 35 +++++++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/Pepperdash Core/Logging/Debug.cs b/src/Pepperdash Core/Logging/Debug.cs index a5e49f4..3f3defe 100644 --- a/src/Pepperdash Core/Logging/Debug.cs +++ b/src/Pepperdash Core/Logging/Debug.cs @@ -150,7 +150,7 @@ namespace PepperDash.Core .Enrich.With(new CrestronEnricher()) .WriteTo.Sink(new DebugConsoleSink(new ExpressionTemplate("[{@t:yyyy-MM-dd HH:mm:ss.fff}][{@l:u4}][{App}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}")), levelSwitch: _consoleLoggingLevelSwitch) .WriteTo.Sink(_websocketSink, levelSwitch: _websocketLoggingLevelSwitch) - .WriteTo.Sink(new DebugErrorLogSink(), levelSwitch: _errorLogLevelSwitch) + .WriteTo.Sink(new DebugErrorLogSink(new ExpressionTemplate("[{@t:yyyy-MM-dd HH:mm:ss.fff}][{@l:u4}][{App}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}")), levelSwitch: _errorLogLevelSwitch) .WriteTo.File(new RenderedCompactJsonFormatter(), logFilePath, rollingInterval: RollingInterval.Day, restrictedToMinimumLevel: LogEventLevel.Debug, diff --git a/src/Pepperdash Core/Logging/DebugErrorLogSink.cs b/src/Pepperdash Core/Logging/DebugErrorLogSink.cs index b5bbb09..3885982 100644 --- a/src/Pepperdash Core/Logging/DebugErrorLogSink.cs +++ b/src/Pepperdash Core/Logging/DebugErrorLogSink.cs @@ -1,8 +1,10 @@ using Crestron.SimplSharp; using Serilog.Core; using Serilog.Events; +using Serilog.Formatting; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -11,6 +13,8 @@ namespace PepperDash.Core.Logging { public class DebugErrorLogSink : ILogEventSink { + private ITextFormatter _formatter; + private Dictionary> _errorLogMap = new Dictionary> { { LogEventLevel.Verbose, (msg) => ErrorLog.Notice(msg) }, @@ -22,15 +26,27 @@ namespace PepperDash.Core.Logging }; public void Emit(LogEvent logEvent) { - var programId = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance - ? $"App {InitialParametersClass.ApplicationNumber}" - : $"Room {InitialParametersClass.RoomId}"; + string message; - string message = $"[{logEvent.Timestamp}][{logEvent.Level}][{programId}]{logEvent.RenderMessage()}"; - - if (logEvent.Properties.TryGetValue("Key", out var value) && value is ScalarValue sv && sv.Value is string rawValue) + if (_formatter == null) { - message = $"[{logEvent.Timestamp}][{logEvent.Level}][{programId}][{rawValue}]: {logEvent.RenderMessage()}"; + var programId = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance + ? $"App {InitialParametersClass.ApplicationNumber}" + : $"Room {InitialParametersClass.RoomId}"; + + message = $"[{logEvent.Timestamp}][{logEvent.Level}][{programId}]{logEvent.RenderMessage()}"; + + if (logEvent.Properties.TryGetValue("Key", out var value) && value is ScalarValue sv && sv.Value is string rawValue) + { + message = $"[{logEvent.Timestamp}][{logEvent.Level}][{programId}][{rawValue}]: {logEvent.RenderMessage()}"; + } + } else + { + var buffer = new StringWriter(new StringBuilder(256)); + + _formatter.Format(logEvent, buffer); + + message = buffer.ToString(); } if(!_errorLogMap.TryGetValue(logEvent.Level, out var handler)) @@ -40,5 +56,10 @@ namespace PepperDash.Core.Logging handler(message); } + + public DebugErrorLogSink(ITextFormatter formatter = null) + { + _formatter = formatter; + } } } From e9be8c98a27db10fa05889874fd1f8f6820c30e0 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 15 May 2024 23:54:09 -0500 Subject: [PATCH 08/10] refactor: remove `room` --- src/Pepperdash Core/Logging/CrestronEnricher.cs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Pepperdash Core/Logging/CrestronEnricher.cs b/src/Pepperdash Core/Logging/CrestronEnricher.cs index 623530e..902ce8d 100644 --- a/src/Pepperdash Core/Logging/CrestronEnricher.cs +++ b/src/Pepperdash Core/Logging/CrestronEnricher.cs @@ -15,15 +15,14 @@ namespace PepperDash.Core.Logging static CrestronEnricher() { - if(CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance) + switch (CrestronEnvironment.DevicePlatform) { - _appName = $"App {InitialParametersClass.ApplicationNumber}"; - return; - } - - if(CrestronEnvironment.DevicePlatform == eDevicePlatform.Server) - { - _appName = $"Room {InitialParametersClass.RoomId}"; + case eDevicePlatform.Appliance: + _appName = $"App {InitialParametersClass.ApplicationNumber}"; + break; + case eDevicePlatform.Server: + _appName = $"{InitialParametersClass.RoomId}"; + break; } } From fb3e9774c74b9edb8f00ad83f9083afe1f311d7b Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 15 May 2024 23:54:34 -0500 Subject: [PATCH 09/10] fix: modify format for error log depending on environment --- src/Pepperdash Core/Logging/Debug.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Pepperdash Core/Logging/Debug.cs b/src/Pepperdash Core/Logging/Debug.cs index 3f3defe..f4b42e2 100644 --- a/src/Pepperdash Core/Logging/Debug.cs +++ b/src/Pepperdash Core/Logging/Debug.cs @@ -144,13 +144,17 @@ namespace PepperDash.Core CrestronConsole.PrintLine($"Saving log files to {logFilePath}"); + var errorLogTemplate = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance + ? "{@t:fff}ms [{@l:u4}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}" + : "[{@t:yyyy-MM-dd HH:mm:ss.fff}][{@l:u4}][{App}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}"; + _defaultLoggerConfiguration = new LoggerConfiguration() .MinimumLevel.Verbose() .Enrich.FromLogContext() .Enrich.With(new CrestronEnricher()) .WriteTo.Sink(new DebugConsoleSink(new ExpressionTemplate("[{@t:yyyy-MM-dd HH:mm:ss.fff}][{@l:u4}][{App}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}")), levelSwitch: _consoleLoggingLevelSwitch) .WriteTo.Sink(_websocketSink, levelSwitch: _websocketLoggingLevelSwitch) - .WriteTo.Sink(new DebugErrorLogSink(new ExpressionTemplate("[{@t:yyyy-MM-dd HH:mm:ss.fff}][{@l:u4}][{App}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}")), levelSwitch: _errorLogLevelSwitch) + .WriteTo.Sink(new DebugErrorLogSink(new ExpressionTemplate(errorLogTemplate)), levelSwitch: _errorLogLevelSwitch) .WriteTo.File(new RenderedCompactJsonFormatter(), logFilePath, rollingInterval: RollingInterval.Day, restrictedToMinimumLevel: LogEventLevel.Debug, From e9dcd1636acaa1fc93433739e1a3101e0afc4ac4 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Thu, 16 May 2024 00:02:47 -0500 Subject: [PATCH 10/10] build: update Crestron libraries --- src/Pepperdash Core/PepperDash_Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Pepperdash Core/PepperDash_Core.csproj b/src/Pepperdash Core/PepperDash_Core.csproj index 0e76202..933fa1d 100644 --- a/src/Pepperdash Core/PepperDash_Core.csproj +++ b/src/Pepperdash Core/PepperDash_Core.csproj @@ -33,7 +33,7 @@ - +