diff --git a/src/Pepperdash.Core/Logging/DebugConsoleSink.cs b/src/Pepperdash.Core/Logging/DebugConsoleSink.cs
index ff8d61f..dc9ef15 100644
--- a/src/Pepperdash.Core/Logging/DebugConsoleSink.cs
+++ b/src/Pepperdash.Core/Logging/DebugConsoleSink.cs
@@ -1,69 +1,81 @@
-using System.IO;
-using System.Text;
-using Crestron.SimplSharp;
-using Serilog;
-using Serilog.Configuration;
-using Serilog.Core;
-using Serilog.Events;
-using Serilog.Formatting;
-using Serilog.Formatting.Json;
-
-namespace PepperDash.Core.Logging
-{
- public class DebugConsoleSink : ILogEventSink
- {
- private readonly ITextFormatter textFormatter;
-
- public void Emit(LogEvent logEvent)
- {
-
- /*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);
- }
-
- public DebugConsoleSink(ITextFormatter formatProvider)
- {
- textFormatter = formatProvider ?? new JsonFormatter();
- }
- }
-
- public static class DebugConsoleSinkExtensions
- {
- public static LoggerConfiguration DebugConsoleSink(
- this LoggerSinkConfiguration loggerConfiguration,
- ITextFormatter formatProvider = null,
- LoggingLevelSwitch levelSwitch = null)
- {
- var sink = new DebugConsoleSink(formatProvider);
- return loggerConfiguration.Conditional(Predicate, c => c.Sink(sink, levelSwitch: levelSwitch));
-
- static bool Predicate(LogEvent @event)
- {
- if (!Debug.IsRunningOnAppliance)
- {
- return false;
- }
-
- if (@event.Properties.TryGetValue("Key", out var value) &&
- value is ScalarValue { Value: string rawValue })
- {
- return DebugContext.DeviceExistsInContext(Debug.ConsoleLevelStoreKey, rawValue);
- }
-
- return true;
- }
- }
- }
-}
+using System.IO;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Serilog;
+using Serilog.Configuration;
+using Serilog.Core;
+using Serilog.Events;
+using Serilog.Formatting;
+using Serilog.Formatting.Json;
+
+namespace PepperDash.Core.Logging
+{
+ public class DebugConsoleSink : ILogEventSink
+ {
+ private readonly ITextFormatter textFormatter;
+
+ public void Emit(LogEvent logEvent)
+ {
+
+ /*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);
+ }
+
+ public DebugConsoleSink(ITextFormatter formatProvider)
+ {
+ textFormatter = formatProvider ?? new JsonFormatter();
+ }
+ }
+
+ public static class DebugConsoleSinkExtensions
+ {
+ public static LoggerConfiguration DebugConsoleSink(
+ this LoggerSinkConfiguration loggerConfiguration,
+ ITextFormatter formatProvider = null,
+ LoggingLevelSwitch levelSwitch = null)
+ {
+ var sink = new DebugConsoleSink(formatProvider);
+ return loggerConfiguration.Conditional(Predicate, c => c.Sink(sink, levelSwitch: levelSwitch));
+
+ static bool Predicate(LogEvent @event)
+ {
+ if (!Debug.IsRunningOnAppliance)
+ {
+ return false;
+ }
+
+ if (@event.Properties.TryGetValue("Key", out var value) && value is ScalarValue { Value: string rawValue }
+ && DebugContext.TryGetDataForKey(Debug.ConsoleLevelStoreKey, out var data)
+ && data.Devices != null)
+ {
+ if (data.Devices.Length == 0)
+ {
+ return true;
+ }
+
+ if (data.Devices.Any(d => d == rawValue))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ return true;
+ }
+ }
+ }
+}
diff --git a/src/Pepperdash.Core/Logging/DebugContext.cs b/src/Pepperdash.Core/Logging/DebugContext.cs
index 35cdb90..6e093e9 100644
--- a/src/Pepperdash.Core/Logging/DebugContext.cs
+++ b/src/Pepperdash.Core/Logging/DebugContext.cs
@@ -1,110 +1,107 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using Crestron.SimplSharp;
-using Newtonsoft.Json;
-using Serilog;
-using Serilog.Events;
-
-namespace PepperDash.Core.Logging
-{
- ///
- /// Represents a debugging context
- ///
- public static class DebugContext
- {
- private static readonly CTimer SaveTimer;
- private static readonly Dictionary CurrentData;
-
- public static readonly string ApplianceFilePath = Path.Combine("/", "user", "debug", $"app{InitialParametersClass.ApplicationNumber.ToString().PadLeft(2, '0')}-debug.json");
- public static readonly string ServerFilePath = Path.Combine("/", "User", "debug", $"{InitialParametersClass.RoomId}-debug.json");
-
- ///
- /// The name of the file containing the current debug settings.
- ///
- public static readonly string FileName = CrestronEnvironment.DevicePlatform switch
- {
- eDevicePlatform.Appliance => ApplianceFilePath,
- eDevicePlatform.Server => ServerFilePath,
- _ => string.Empty
- };
-
- static DebugContext()
- {
- CurrentData = LoadData();
- SaveTimer = new CTimer(_ => SaveData(), Timeout.Infinite);
-
- CrestronEnvironment.ProgramStatusEventHandler += args =>
- {
- if (args == eProgramStatusEventType.Stopping)
- {
- using (SaveTimer)
- {
- SaveData();
- SaveTimer.Stop();
- }
- }
- };
- }
-
- public static DebugContextData GetDataForKey(string key, LogEventLevel defaultLevel) =>
- CurrentData.TryGetValue(key, out var data) ? data : new DebugContextData(defaultLevel);
-
- public static bool DeviceExistsInContext(string contextKey, string deviceKey) =>
- CurrentData.TryGetValue(contextKey, out var data) switch
- {
- true when data.Devices != null => data.Devices.Any(key => string.Equals(key, deviceKey, StringComparison.OrdinalIgnoreCase)),
- _ => false
- };
-
- public static void SetDataForKey(string key, LogEventLevel defaultLevel, string[] devices = null)
- {
- if (CurrentData.ContainsKey(key))
- {
- CurrentData[key] = new DebugContextData(defaultLevel, devices);
- }
- else
- {
- CurrentData.Add(key, new DebugContextData(defaultLevel, devices));
- }
-
- SaveTimer.Reset(5000);
- }
-
- private static void SaveData()
- {
- Log.Information("Saving debug data to file:{File}", FileName);
-
- try
- {
- var debugDirectory = Path.GetDirectoryName(FileName) ??
- throw new Exception("File directory is root");
-
- Directory.CreateDirectory(debugDirectory);
- var json = JsonConvert.SerializeObject(CurrentData);
- File.WriteAllText(FileName, json);
- }
- catch (Exception e)
- {
- Log.Error(e, "Failed to save debug data");
- }
- }
-
- private static Dictionary LoadData()
- {
- if (!File.Exists(FileName))
- {
- return new Dictionary();
- }
-
- var json = File.ReadAllText(FileName);
- return JsonConvert.DeserializeObject>(json);
- }
- }
-
- ///
- ///
- ///
- public record DebugContextData(LogEventLevel Level, string[] Devices = null);
-}
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Crestron.SimplSharp;
+using Newtonsoft.Json;
+using Serilog;
+using Serilog.Events;
+
+namespace PepperDash.Core.Logging
+{
+ ///
+ /// Represents a debugging context
+ ///
+ public static class DebugContext
+ {
+ private static readonly CTimer SaveTimer;
+ private static readonly Dictionary CurrentData;
+
+ public static readonly string ApplianceFilePath = Path.Combine("/", "user", "debug", $"app{InitialParametersClass.ApplicationNumber.ToString().PadLeft(2, '0')}-debug.json");
+ public static readonly string ServerFilePath = Path.Combine("/", "User", "debug", $"{InitialParametersClass.RoomId}-debug.json");
+
+ ///
+ /// The name of the file containing the current debug settings.
+ ///
+ public static readonly string FileName = CrestronEnvironment.DevicePlatform switch
+ {
+ eDevicePlatform.Appliance => ApplianceFilePath,
+ eDevicePlatform.Server => ServerFilePath,
+ _ => string.Empty
+ };
+
+ static DebugContext()
+ {
+ CurrentData = LoadData();
+ SaveTimer = new CTimer(_ => SaveData(), Timeout.Infinite);
+
+ CrestronEnvironment.ProgramStatusEventHandler += args =>
+ {
+ if (args == eProgramStatusEventType.Stopping)
+ {
+ using (SaveTimer)
+ {
+ SaveData();
+ SaveTimer.Stop();
+ }
+ }
+ };
+ }
+
+ public static bool TryGetDataForKey(string key, out DebugContextData data) =>
+ CurrentData.TryGetValue(key, out var data);
+
+ public static DebugContextData GetOrCreateDataForKey(string key, LogEventLevel defaultLevel) =>
+ CurrentData.TryGetValue(key, out var data) ? data : new DebugContextData(defaultLevel);
+
+
+ public static void SetDataForKey(string key, LogEventLevel defaultLevel, string[] devices = null)
+ {
+ if (CurrentData.ContainsKey(key))
+ {
+ CurrentData[key] = new DebugContextData(defaultLevel, devices);
+ }
+ else
+ {
+ CurrentData.Add(key, new DebugContextData(defaultLevel, devices));
+ }
+
+ SaveTimer.Reset(5000);
+ }
+
+ private static void SaveData()
+ {
+ Log.Information("Saving debug data to file:{File}", FileName);
+
+ try
+ {
+ var debugDirectory = Path.GetDirectoryName(FileName) ??
+ throw new Exception("File directory is root");
+
+ Directory.CreateDirectory(debugDirectory);
+ var json = JsonConvert.SerializeObject(CurrentData);
+ File.WriteAllText(FileName, json);
+ }
+ catch (Exception e)
+ {
+ Log.Error(e, "Failed to save debug data");
+ }
+ }
+
+ private static Dictionary LoadData()
+ {
+ if (!File.Exists(FileName))
+ {
+ return new Dictionary();
+ }
+
+ var json = File.ReadAllText(FileName);
+ return JsonConvert.DeserializeObject>(json);
+ }
+ }
+
+ ///
+ ///
+ ///
+ public record DebugContextData(LogEventLevel Level, string[] Devices = null);
+}