From e7b7350e76e5eac3052a968ef8b32915402e514a Mon Sep 17 00:00:00 2001 From: erri120 Date: Fri, 21 Jan 2022 14:54:22 +0100 Subject: [PATCH] Update logging --- Wabbajack.App.Blazor/App.xaml.cs | 36 ++++- .../Components/VirtualLogger.razor | 23 ++- Wabbajack.App.Blazor/MainWindow.xaml.cs | 22 +-- Wabbajack.App.Blazor/Models/Install.cs | 3 - Wabbajack.App.Blazor/Models/LoggerProvider.cs | 149 ------------------ Wabbajack.App.Blazor/Pages/Configure.razor | 2 +- Wabbajack.App.Blazor/Pages/Configure.razor.cs | 2 - .../Wabbajack.App.Blazor.csproj | 2 + 8 files changed, 42 insertions(+), 197 deletions(-) delete mode 100644 Wabbajack.App.Blazor/Models/Install.cs delete mode 100644 Wabbajack.App.Blazor/Models/LoggerProvider.cs diff --git a/Wabbajack.App.Blazor/App.xaml.cs b/Wabbajack.App.Blazor/App.xaml.cs index 66bbac5b..bc19d3d7 100644 --- a/Wabbajack.App.Blazor/App.xaml.cs +++ b/Wabbajack.App.Blazor/App.xaml.cs @@ -3,11 +3,13 @@ using System.Windows; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using Wabbajack.App.Blazor.Models; +using NLog; +using NLog.Extensions.Logging; +using NLog.Targets; using Wabbajack.App.Blazor.State; using Wabbajack.App.Blazor.Utility; -using Wabbajack.DTOs; using Wabbajack.Services.OSIntegrated; +using LogLevel = Microsoft.Extensions.Logging.LogLevel; namespace Wabbajack.App.Blazor; @@ -18,23 +20,41 @@ public partial class App public App() { _serviceProvider = Host.CreateDefaultBuilder(Array.Empty()) - .ConfigureLogging(loggingBuilder => - { - loggingBuilder.ClearProviders(); - }) + .ConfigureLogging(SetupLogging) .ConfigureServices(services => ConfigureServices(services)) .Build() .Services; } + private static void SetupLogging(ILoggingBuilder loggingBuilder) + { + var config = new NLog.Config.LoggingConfiguration(); + + var fileTarget = new FileTarget("file") + { + FileName = "log.log" + }; + + var consoleTarget = new ConsoleTarget("console"); + + var uiTarget = new MemoryTarget("ui"); + + config.AddRuleForAllLevels(fileTarget); + config.AddRuleForAllLevels(consoleTarget); + config.AddRuleForAllLevels(uiTarget); + + loggingBuilder.ClearProviders(); + loggingBuilder.SetMinimumLevel(LogLevel.Trace); + loggingBuilder.AddNLog(config); + } + private static IServiceCollection ConfigureServices(IServiceCollection services) { services.AddOSIntegrated(); services.AddBlazorWebView(); - services.AddAllSingleton(); services.AddTransient(); services.AddSingleton(); - services.AddSingleton(typeof(IStateContainer), typeof(StateContainer)); + services.AddSingleton(); return services; } diff --git a/Wabbajack.App.Blazor/Components/VirtualLogger.razor b/Wabbajack.App.Blazor/Components/VirtualLogger.razor index 2a1832fb..f2d897a2 100644 --- a/Wabbajack.App.Blazor/Components/VirtualLogger.razor +++ b/Wabbajack.App.Blazor/Components/VirtualLogger.razor @@ -1,10 +1,10 @@ -@using Wabbajack.App.Blazor.Models - +@using NLog +@using NLog.Targets @namespace Wabbajack.App.Blazor.Components
- - @logItem.LongMessage + + @logItem
@@ -13,16 +13,11 @@ // TODO: [Low] More parameters to customise the logger. E.g. Reverse order. // TODO: [High] Find a way to auto-scroll. (JS interop?) - [Parameter] - public IObservable Messages { get; set; } + private MemoryTarget? _memoryTarget; + private ICollection Logs => _memoryTarget?.Logs ?? Array.Empty(); - private List _consoleLog = new(); - - protected override async Task OnInitializedAsync() - { - Messages.Subscribe(_consoleLog.Add); - - await base.OnInitializedAsync(); + protected override void OnInitialized() + { + _memoryTarget = LogManager.Configuration.FindTargetByName("ui"); } - } diff --git a/Wabbajack.App.Blazor/MainWindow.xaml.cs b/Wabbajack.App.Blazor/MainWindow.xaml.cs index 782b736a..074c4cfa 100644 --- a/Wabbajack.App.Blazor/MainWindow.xaml.cs +++ b/Wabbajack.App.Blazor/MainWindow.xaml.cs @@ -1,31 +1,13 @@ using System; -using Microsoft.AspNetCore.Components; -using Microsoft.Extensions.Logging; -using Wabbajack.App.Blazor.Models; using Wabbajack.App.Blazor.State; -using Wabbajack.App.Blazor.Utility; -using Wabbajack.Common; -using Wabbajack.Installer; -using Wabbajack.Paths.IO; namespace Wabbajack.App.Blazor; public partial class MainWindow { - private readonly ILogger _logger; - private readonly LoggerProvider _loggerProvider; - private readonly SystemParametersConstructor _systemParams; - private readonly IStateContainer _stateContainer; - - public MainWindow(ILogger logger, IServiceProvider serviceProvider, LoggerProvider loggerProvider, - SystemParametersConstructor systemParams, IStateContainer stateContainer) + public MainWindow(IServiceProvider serviceProvider, IStateContainer stateContainer) { - _logger = logger; - _loggerProvider = loggerProvider; - _systemParams = systemParams; - _stateContainer = stateContainer; - - _stateContainer.TaskBarStateObservable.Subscribe(state => + stateContainer.TaskBarStateObservable.Subscribe(state => { Dispatcher.InvokeAsync(() => { diff --git a/Wabbajack.App.Blazor/Models/Install.cs b/Wabbajack.App.Blazor/Models/Install.cs deleted file mode 100644 index c8adcc28..00000000 --- a/Wabbajack.App.Blazor/Models/Install.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace Wabbajack.App.Blazor.Models; - -public class Install { } diff --git a/Wabbajack.App.Blazor/Models/LoggerProvider.cs b/Wabbajack.App.Blazor/Models/LoggerProvider.cs deleted file mode 100644 index af1ddc52..00000000 --- a/Wabbajack.App.Blazor/Models/LoggerProvider.cs +++ /dev/null @@ -1,149 +0,0 @@ -using System; -using System.Collections.Immutable; -using System.Collections.ObjectModel; -using System.Diagnostics; -using System.IO; -using System.Reactive.Disposables; -using System.Reactive.Subjects; -using System.Text; -using System.Threading; -using DynamicData; -using Microsoft.Extensions.Logging; -using Wabbajack.Paths; -using Wabbajack.Paths.IO; -using Wabbajack.Services.OSIntegrated; - -namespace Wabbajack.App.Blazor.Models; - -public class LoggerProvider : ILoggerProvider -{ - private readonly RelativePath _appName; - private readonly Configuration _configuration; - private readonly CompositeDisposable _disposables; - private readonly Stream _logFile; - private readonly StreamWriter _logStream; - - public readonly ReadOnlyObservableCollection _messagesFiltered; - private readonly DateTime _startupTime; - - private long _messageId; - private readonly SourceCache _messageLog = new(m => m.MessageId); - private readonly Subject _messages = new(); - - public LoggerProvider(Configuration configuration) - { - _startupTime = DateTime.UtcNow; - _configuration = configuration; - _configuration.LogLocation.CreateDirectory(); - - _disposables = new CompositeDisposable(); - - // Messages - // .ObserveOnGuiThread() - // .Subscribe(m => _messageLog.AddOrUpdate(m)); - - Messages.Subscribe(LogToFile); - - _messageLog.Connect() - .Bind(out _messagesFiltered) - .Subscribe(); - - _appName = typeof(LoggerProvider).Assembly.Location.ToAbsolutePath().FileName; - LogPath = _configuration.LogLocation.Combine($"{_appName}.current.log"); - _logFile = LogPath.Open(FileMode.Append, FileAccess.Write); - - _logStream = new StreamWriter(_logFile, Encoding.UTF8); - } - - public IObservable Messages => _messages; - public AbsolutePath LogPath { get; } - public ReadOnlyObservableCollection MessageLog => _messagesFiltered; - - public void Dispose() - { - _disposables.Dispose(); - } - - public ILogger CreateLogger(string categoryName) - { - return new Logger(this, categoryName); - } - - private void LogToFile(ILogMessage logMessage) - { - var line = $"[{logMessage.TimeStamp - _startupTime}] {logMessage.LongMessage}"; - lock (_logStream) - { - _logStream.Write(line); - _logStream.Flush(); - } - } - - private long NextMessageId() - { - return Interlocked.Increment(ref _messageId); - } - - public class Logger : ILogger - { - private readonly string _categoryName; - private readonly LoggerProvider _provider; - private ImmutableList Scopes = ImmutableList.Empty; - - public Logger(LoggerProvider provider, string categoryName) - { - _categoryName = categoryName; - _provider = provider; - } - - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, - Func formatter) - { - Debug.WriteLine($"{logLevel} - {formatter(state, exception)}"); - _provider._messages.OnNext(new LogMessage(DateTime.UtcNow, _provider.NextMessageId(), logLevel, - eventId, state, exception, formatter)); - } - - public bool IsEnabled(LogLevel logLevel) - { - return true; - } - - public IDisposable BeginScope(TState state) - { - Scopes = Scopes.Add(state); - return Disposable.Create(() => Scopes = Scopes.Remove(state)); - } - } - - public interface ILogMessage - { - long MessageId { get; } - - string ShortMessage { get; } - DateTime TimeStamp { get; } - string LongMessage { get; } - } - - private record LogMessage(DateTime TimeStamp, long MessageId, LogLevel LogLevel, EventId EventId, - TState State, Exception? Exception, Func Formatter) : ILogMessage - { - public string ShortMessage => Formatter(State, Exception); - - public string LongMessage - { - get - { - var sb = new StringBuilder(); - sb.AppendLine(ShortMessage); - if (Exception != null) - { - sb.Append("Exception: "); - sb.Append(Exception); - } - - return sb.ToString(); - } - } - } -} diff --git a/Wabbajack.App.Blazor/Pages/Configure.razor b/Wabbajack.App.Blazor/Pages/Configure.razor index fc114df9..2f032d82 100644 --- a/Wabbajack.App.Blazor/Pages/Configure.razor +++ b/Wabbajack.App.Blazor/Pages/Configure.razor @@ -41,7 +41,7 @@ @if (InstallState == InstallState.Installing) {
- +
} else diff --git a/Wabbajack.App.Blazor/Pages/Configure.razor.cs b/Wabbajack.App.Blazor/Pages/Configure.razor.cs index ac649895..839e693d 100644 --- a/Wabbajack.App.Blazor/Pages/Configure.razor.cs +++ b/Wabbajack.App.Blazor/Pages/Configure.razor.cs @@ -12,7 +12,6 @@ using Wabbajack.Services.OSIntegrated; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.JSInterop; -using Wabbajack.App.Blazor.Models; using Wabbajack.App.Blazor.State; namespace Wabbajack.App.Blazor.Pages; @@ -26,7 +25,6 @@ public partial class Configure [Inject] private SystemParametersConstructor ParametersConstructor { get; set; } = default!; [Inject] private IGameLocator GameLocator { get; set; } = default!; [Inject] private SettingsManager SettingsManager { get; set; } = default!; - [Inject] private LoggerProvider LoggerProvider { get; set; } = default!; [Inject] private JSRuntime JSRuntime { get; set; } = default!; private ModList? Modlist => StateContainer.Modlist; diff --git a/Wabbajack.App.Blazor/Wabbajack.App.Blazor.csproj b/Wabbajack.App.Blazor/Wabbajack.App.Blazor.csproj index 893137c6..94ebf08a 100644 --- a/Wabbajack.App.Blazor/Wabbajack.App.Blazor.csproj +++ b/Wabbajack.App.Blazor/Wabbajack.App.Blazor.csproj @@ -20,6 +20,8 @@ + +