You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.4 KiB
76 lines
2.4 KiB
1 year ago
|
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<IServiceProvider>();
|
||
|
|
||
|
// reference the shared instance
|
||
|
_dataStore = LogDataStore.Instance;
|
||
|
// _dataStore = serviceProvider.GetRequiredService<ILogDataStore>();
|
||
|
|
||
|
// load the config options
|
||
|
/*var options
|
||
|
= serviceProvider.GetService<IOptionsMonitor<DataStoreLoggerConfiguration>>();*/
|
||
|
|
||
|
// _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
|
||
|
}
|