using System.Diagnostics; using Microsoft.Extensions.Logging; using NLog; using NLog.Targets; using StabilityMatrix.Avalonia.Diagnostics.LogViewer.Core.Logging; using MsLogLevel = Microsoft.Extensions.Logging.LogLevel; namespace StabilityMatrix.Avalonia.Diagnostics.LogViewer; [Target("DataStoreLogger")] public class DataStoreLoggerTarget : TargetWithLayout { #region Fields private ILogDataStore? _dataStore; private DataStoreLoggerConfiguration? _config; #endregion #region methods protected override void InitializeTarget() { // we need to inject dependencies // var serviceProvider = ResolveService(); // reference the shared instance _dataStore = LogDataStore.Instance; // _dataStore = serviceProvider.GetRequiredService(); // load the config options /*var options = serviceProvider.GetService>();*/ // _config = options?.CurrentValue ?? new DataStoreLoggerConfiguration(); _config = new DataStoreLoggerConfiguration(); base.InitializeTarget(); } protected override void Write(LogEventInfo logEvent) { // cast NLog Loglevel to Microsoft LogLevel type var logLevel = (MsLogLevel)Enum.ToObject(typeof(MsLogLevel), logEvent.Level.Ordinal); // format the message var message = RenderLogEvent(Layout, logEvent); // retrieve the EventId logEvent.Properties.TryGetValue("EventId", out var result); if (result is not EventId eventId) { eventId = _config!.EventId; } // add log entry _dataStore?.AddEntry(new LogModel { Timestamp = DateTime.UtcNow, LogLevel = logLevel, // do we override the default EventId if it exists? EventId = eventId.Id == 0 && (_config?.EventId.Id ?? 0) != 0 ? _config!.EventId : eventId, State = message, LoggerName = logEvent.LoggerName, CallerClassName = logEvent.CallerClassName, CallerMemberName = logEvent.CallerMemberName, Exception = logEvent.Exception?.Message ?? (logLevel == MsLogLevel.Error ? message : ""), Color = _config!.Colors[logLevel], }); Debug.WriteLine($"--- [{logLevel.ToString()[..3]}] {message} - {logEvent.Exception?.Message ?? "no error"}"); } #endregion }