|
|
|
@ -1,3 +1,7 @@
|
|
|
|
|
#if DEBUG |
|
|
|
|
using StabilityMatrix.Avalonia.Diagnostics.LogViewer; |
|
|
|
|
using StabilityMatrix.Avalonia.Diagnostics.LogViewer.Extensions; |
|
|
|
|
#endif |
|
|
|
|
using System; |
|
|
|
|
using System.Diagnostics; |
|
|
|
|
using System.Diagnostics.CodeAnalysis; |
|
|
|
@ -32,10 +36,7 @@ using Polly.Timeout;
|
|
|
|
|
using Refit; |
|
|
|
|
using Sentry; |
|
|
|
|
using StabilityMatrix.Avalonia.Controls; |
|
|
|
|
using StabilityMatrix.Avalonia.Controls.CodeCompletion; |
|
|
|
|
using StabilityMatrix.Avalonia.DesignData; |
|
|
|
|
using StabilityMatrix.Avalonia.Diagnostics.LogViewer; |
|
|
|
|
using StabilityMatrix.Avalonia.Diagnostics.LogViewer.Extensions; |
|
|
|
|
using StabilityMatrix.Avalonia.Helpers; |
|
|
|
|
using StabilityMatrix.Avalonia.Languages; |
|
|
|
|
using StabilityMatrix.Avalonia.Models; |
|
|
|
@ -46,8 +47,8 @@ using StabilityMatrix.Avalonia.ViewModels.Base;
|
|
|
|
|
using StabilityMatrix.Avalonia.ViewModels.CheckpointBrowser; |
|
|
|
|
using StabilityMatrix.Avalonia.ViewModels.CheckpointManager; |
|
|
|
|
using StabilityMatrix.Avalonia.ViewModels.Dialogs; |
|
|
|
|
using StabilityMatrix.Avalonia.ViewModels.PackageManager; |
|
|
|
|
using StabilityMatrix.Avalonia.ViewModels.Inference; |
|
|
|
|
using StabilityMatrix.Avalonia.ViewModels.PackageManager; |
|
|
|
|
using StabilityMatrix.Avalonia.ViewModels.Settings; |
|
|
|
|
using StabilityMatrix.Avalonia.Views; |
|
|
|
|
using StabilityMatrix.Avalonia.Views.Dialogs; |
|
|
|
@ -73,11 +74,18 @@ namespace StabilityMatrix.Avalonia;
|
|
|
|
|
|
|
|
|
|
public sealed class App : Application |
|
|
|
|
{ |
|
|
|
|
[NotNull] public static IServiceProvider? Services { get; private set; } |
|
|
|
|
[NotNull] public static Visual? VisualRoot { get; private set; } |
|
|
|
|
[NotNull] public static IStorageProvider? StorageProvider { get; private set; } |
|
|
|
|
[NotNull] |
|
|
|
|
public static IServiceProvider? Services { get; private set; } |
|
|
|
|
|
|
|
|
|
[NotNull] |
|
|
|
|
public static Visual? VisualRoot { get; private set; } |
|
|
|
|
|
|
|
|
|
[NotNull] |
|
|
|
|
public static IStorageProvider? StorageProvider { get; private set; } |
|
|
|
|
|
|
|
|
|
// ReSharper disable once MemberCanBePrivate.Global |
|
|
|
|
[NotNull] public static IConfiguration? Config { get; private set; } |
|
|
|
|
[NotNull] |
|
|
|
|
public static IConfiguration? Config { get; private set; } |
|
|
|
|
|
|
|
|
|
// ReSharper disable once MemberCanBePrivate.Global |
|
|
|
|
public IClassicDesktopStyleApplicationLifetime? DesktopLifetime => |
|
|
|
@ -123,8 +131,9 @@ public sealed class App : Application
|
|
|
|
|
setupWindow.ShowActivated = true; |
|
|
|
|
setupWindow.ShowAsyncCts = new CancellationTokenSource(); |
|
|
|
|
|
|
|
|
|
setupWindow.ExtendClientAreaChromeHints = Program.Args.NoWindowChromeEffects ? |
|
|
|
|
ExtendClientAreaChromeHints.NoChrome : ExtendClientAreaChromeHints.PreferSystemChrome; |
|
|
|
|
setupWindow.ExtendClientAreaChromeHints = Program.Args.NoWindowChromeEffects |
|
|
|
|
? ExtendClientAreaChromeHints.NoChrome |
|
|
|
|
: ExtendClientAreaChromeHints.PreferSystemChrome; |
|
|
|
|
|
|
|
|
|
DesktopLifetime.MainWindow = setupWindow; |
|
|
|
|
|
|
|
|
@ -151,15 +160,17 @@ public sealed class App : Application
|
|
|
|
|
|
|
|
|
|
private void ShowMainWindow() |
|
|
|
|
{ |
|
|
|
|
if (DesktopLifetime is null) return; |
|
|
|
|
if (DesktopLifetime is null) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
var mainViewModel = Services.GetRequiredService<MainWindowViewModel>(); |
|
|
|
|
|
|
|
|
|
var mainWindow = Services.GetRequiredService<MainWindow>(); |
|
|
|
|
mainWindow.DataContext = mainViewModel; |
|
|
|
|
|
|
|
|
|
mainWindow.ExtendClientAreaChromeHints = Program.Args.NoWindowChromeEffects ? |
|
|
|
|
ExtendClientAreaChromeHints.NoChrome : ExtendClientAreaChromeHints.PreferSystemChrome; |
|
|
|
|
mainWindow.ExtendClientAreaChromeHints = Program.Args.NoWindowChromeEffects |
|
|
|
|
? ExtendClientAreaChromeHints.NoChrome |
|
|
|
|
: ExtendClientAreaChromeHints.PreferSystemChrome; |
|
|
|
|
|
|
|
|
|
var settingsManager = Services.GetRequiredService<ISettingsManager>(); |
|
|
|
|
var windowSettings = settingsManager.Settings.WindowSettings; |
|
|
|
@ -176,16 +187,22 @@ public sealed class App : Application
|
|
|
|
|
|
|
|
|
|
mainWindow.Closing += (_, _) => |
|
|
|
|
{ |
|
|
|
|
var validWindowPosition = |
|
|
|
|
mainWindow.Screens.All.Any(screen => screen.Bounds.Contains(mainWindow.Position)); |
|
|
|
|
var validWindowPosition = mainWindow.Screens.All.Any( |
|
|
|
|
screen => screen.Bounds.Contains(mainWindow.Position) |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
settingsManager.Transaction(s => |
|
|
|
|
settingsManager.Transaction( |
|
|
|
|
s => |
|
|
|
|
{ |
|
|
|
|
s.WindowSettings = new WindowSettings( |
|
|
|
|
mainWindow.Width, mainWindow.Height, |
|
|
|
|
mainWindow.Width, |
|
|
|
|
mainWindow.Height, |
|
|
|
|
validWindowPosition ? mainWindow.Position.X : 0, |
|
|
|
|
validWindowPosition ? mainWindow.Position.Y : 0); |
|
|
|
|
}, ignoreMissingLibraryDir: true); |
|
|
|
|
validWindowPosition ? mainWindow.Position.Y : 0 |
|
|
|
|
); |
|
|
|
|
}, |
|
|
|
|
ignoreMissingLibraryDir: true |
|
|
|
|
); |
|
|
|
|
}; |
|
|
|
|
mainWindow.Closed += (_, _) => Shutdown(); |
|
|
|
|
|
|
|
|
@ -213,7 +230,8 @@ public sealed class App : Application
|
|
|
|
|
|
|
|
|
|
internal static void ConfigurePageViewModels(IServiceCollection services) |
|
|
|
|
{ |
|
|
|
|
services.AddSingleton<PackageManagerViewModel>() |
|
|
|
|
services |
|
|
|
|
.AddSingleton<PackageManagerViewModel>() |
|
|
|
|
.AddSingleton<SettingsViewModel>() |
|
|
|
|
.AddSingleton<InferenceSettingsViewModel>() |
|
|
|
|
.AddSingleton<CheckpointBrowserViewModel>() |
|
|
|
@ -223,11 +241,14 @@ public sealed class App : Application
|
|
|
|
|
.AddSingleton<ProgressManagerViewModel>() |
|
|
|
|
.AddSingleton<InferenceViewModel>(); |
|
|
|
|
|
|
|
|
|
services.AddSingleton<MainWindowViewModel>(provider => |
|
|
|
|
new MainWindowViewModel(provider.GetRequiredService<ISettingsManager>(), |
|
|
|
|
services.AddSingleton<MainWindowViewModel>( |
|
|
|
|
provider => |
|
|
|
|
new MainWindowViewModel( |
|
|
|
|
provider.GetRequiredService<ISettingsManager>(), |
|
|
|
|
provider.GetRequiredService<IDiscordRichPresenceService>(), |
|
|
|
|
provider.GetRequiredService<ServiceManager<ViewModelBase>>(), |
|
|
|
|
provider.GetRequiredService<ITrackedDownloadService>()) |
|
|
|
|
provider.GetRequiredService<ITrackedDownloadService>() |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
Pages = |
|
|
|
|
{ |
|
|
|
@ -237,15 +258,12 @@ public sealed class App : Application
|
|
|
|
|
provider.GetRequiredService<CheckpointsPageViewModel>(), |
|
|
|
|
provider.GetRequiredService<CheckpointBrowserViewModel>(), |
|
|
|
|
}, |
|
|
|
|
FooterPages = |
|
|
|
|
{ |
|
|
|
|
provider.GetRequiredService<SettingsViewModel>() |
|
|
|
|
FooterPages = { provider.GetRequiredService<SettingsViewModel>() } |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// Register disposable view models for shutdown cleanup |
|
|
|
|
services.AddSingleton<IDisposable>(p |
|
|
|
|
=> p.GetRequiredService<LaunchPageViewModel>()); |
|
|
|
|
services.AddSingleton<IDisposable>(p => p.GetRequiredService<LaunchPageViewModel>()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
internal static void ConfigureDialogViewModels(IServiceCollection services) |
|
|
|
@ -290,7 +308,8 @@ public sealed class App : Application
|
|
|
|
|
services.AddTransient<BatchSizeCardViewModel>(); |
|
|
|
|
|
|
|
|
|
// Dialog factory |
|
|
|
|
services.AddSingleton<ServiceManager<ViewModelBase>>(provider => |
|
|
|
|
services.AddSingleton<ServiceManager<ViewModelBase>>( |
|
|
|
|
provider => |
|
|
|
|
new ServiceManager<ViewModelBase>() |
|
|
|
|
.Register(provider.GetRequiredService<InstallerViewModel>) |
|
|
|
|
.Register(provider.GetRequiredService<OneClickInstallViewModel>) |
|
|
|
@ -404,13 +423,15 @@ public sealed class App : Application
|
|
|
|
|
services.AddSingleton<IModelIndexService, ModelIndexService>(); |
|
|
|
|
|
|
|
|
|
services.AddSingleton<ITrackedDownloadService, TrackedDownloadService>(); |
|
|
|
|
services.AddSingleton<IDisposable>(provider => |
|
|
|
|
(IDisposable) provider.GetRequiredService<ITrackedDownloadService>()); |
|
|
|
|
services.AddSingleton<IDisposable>( |
|
|
|
|
provider => (IDisposable)provider.GetRequiredService<ITrackedDownloadService>() |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// Rich presence |
|
|
|
|
services.AddSingleton<IDiscordRichPresenceService, DiscordRichPresenceService>(); |
|
|
|
|
services.AddSingleton<IDisposable>(provider => |
|
|
|
|
provider.GetRequiredService<IDiscordRichPresenceService>()); |
|
|
|
|
services.AddSingleton<IDisposable>( |
|
|
|
|
provider => provider.GetRequiredService<IDiscordRichPresenceService>() |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
Config = new ConfigurationBuilder() |
|
|
|
|
.SetBasePath(Directory.GetCurrentDirectory()) |
|
|
|
@ -460,13 +481,13 @@ public sealed class App : Application
|
|
|
|
|
jsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter()); |
|
|
|
|
jsonSerializerOptions.Converters.Add(new DefaultUnknownEnumConverter<CivitFileType>()); |
|
|
|
|
jsonSerializerOptions.Converters.Add( |
|
|
|
|
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)); |
|
|
|
|
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) |
|
|
|
|
); |
|
|
|
|
jsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; |
|
|
|
|
|
|
|
|
|
var defaultRefitSettings = new RefitSettings |
|
|
|
|
{ |
|
|
|
|
ContentSerializer = |
|
|
|
|
new SystemTextJsonContentSerializer(jsonSerializerOptions) |
|
|
|
|
ContentSerializer = new SystemTextJsonContentSerializer(jsonSerializerOptions) |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Refit settings for IApiFactory |
|
|
|
@ -475,8 +496,7 @@ public sealed class App : Application
|
|
|
|
|
defaultSystemTextJsonSettings.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; |
|
|
|
|
var apiFactoryRefitSettings = new RefitSettings |
|
|
|
|
{ |
|
|
|
|
ContentSerializer = |
|
|
|
|
new SystemTextJsonContentSerializer(defaultSystemTextJsonSettings), |
|
|
|
|
ContentSerializer = new SystemTextJsonContentSerializer(defaultSystemTextJsonSettings), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// HTTP Policies |
|
|
|
@ -488,9 +508,10 @@ public sealed class App : Application
|
|
|
|
|
HttpStatusCode.ServiceUnavailable, // 503 |
|
|
|
|
HttpStatusCode.GatewayTimeout // 504 |
|
|
|
|
}; |
|
|
|
|
var delay = Backoff |
|
|
|
|
.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromMilliseconds(80), |
|
|
|
|
retryCount: 5); |
|
|
|
|
var delay = Backoff.DecorrelatedJitterBackoffV2( |
|
|
|
|
medianFirstRetryDelay: TimeSpan.FromMilliseconds(80), |
|
|
|
|
retryCount: 5 |
|
|
|
|
); |
|
|
|
|
var retryPolicy = HttpPolicyExtensions |
|
|
|
|
.HandleTransientHttpError() |
|
|
|
|
.Or<TimeoutRejectedException>() |
|
|
|
@ -499,25 +520,29 @@ public sealed class App : Application
|
|
|
|
|
|
|
|
|
|
// Shorter timeout for local requests |
|
|
|
|
var localTimeout = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(3)); |
|
|
|
|
var localDelay = Backoff |
|
|
|
|
.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromMilliseconds(50), |
|
|
|
|
retryCount: 3); |
|
|
|
|
var localDelay = Backoff.DecorrelatedJitterBackoffV2( |
|
|
|
|
medianFirstRetryDelay: TimeSpan.FromMilliseconds(50), |
|
|
|
|
retryCount: 3 |
|
|
|
|
); |
|
|
|
|
var localRetryPolicy = HttpPolicyExtensions |
|
|
|
|
.HandleTransientHttpError() |
|
|
|
|
.Or<TimeoutRejectedException>() |
|
|
|
|
.OrResult(r => retryStatusCodes.Contains(r.StatusCode)) |
|
|
|
|
.WaitAndRetryAsync(localDelay, onRetryAsync: (_, _) => |
|
|
|
|
.WaitAndRetryAsync( |
|
|
|
|
localDelay, |
|
|
|
|
onRetryAsync: (_, _) => |
|
|
|
|
{ |
|
|
|
|
Debug.WriteLine("Retrying local request..."); |
|
|
|
|
return Task.CompletedTask; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// named client for update |
|
|
|
|
services.AddHttpClient("UpdateClient") |
|
|
|
|
.AddPolicyHandler(retryPolicy); |
|
|
|
|
services.AddHttpClient("UpdateClient").AddPolicyHandler(retryPolicy); |
|
|
|
|
|
|
|
|
|
// Add Refit clients |
|
|
|
|
services.AddRefitClient<ICivitApi>(defaultRefitSettings) |
|
|
|
|
services |
|
|
|
|
.AddRefitClient<ICivitApi>(defaultRefitSettings) |
|
|
|
|
.ConfigureHttpClient(c => |
|
|
|
|
{ |
|
|
|
|
c.BaseAddress = new Uri("https://civitai.com"); |
|
|
|
@ -526,18 +551,21 @@ public sealed class App : Application
|
|
|
|
|
.AddPolicyHandler(retryPolicy); |
|
|
|
|
|
|
|
|
|
// Add Refit client managers |
|
|
|
|
services.AddHttpClient("A3Client") |
|
|
|
|
services |
|
|
|
|
.AddHttpClient("A3Client") |
|
|
|
|
.AddPolicyHandler(localTimeout.WrapAsync(localRetryPolicy)); |
|
|
|
|
|
|
|
|
|
/*services.AddHttpClient("IComfyApi") |
|
|
|
|
.AddPolicyHandler(localTimeout.WrapAsync(localRetryPolicy));*/ |
|
|
|
|
|
|
|
|
|
// Add Refit client factory |
|
|
|
|
services.AddSingleton<IApiFactory, ApiFactory>(provider => |
|
|
|
|
services.AddSingleton<IApiFactory, ApiFactory>( |
|
|
|
|
provider => |
|
|
|
|
new ApiFactory(provider.GetRequiredService<IHttpClientFactory>()) |
|
|
|
|
{ |
|
|
|
|
RefitSettings = apiFactoryRefitSettings, |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
ConditionalAddLogViewer(services); |
|
|
|
|
|
|
|
|
@ -545,18 +573,21 @@ public sealed class App : Application
|
|
|
|
|
services.AddLogging(builder => |
|
|
|
|
{ |
|
|
|
|
builder.ClearProviders(); |
|
|
|
|
builder.AddFilter("Microsoft.Extensions.Http", LogLevel.Warning) |
|
|
|
|
builder |
|
|
|
|
.AddFilter("Microsoft.Extensions.Http", LogLevel.Warning) |
|
|
|
|
.AddFilter("Microsoft.Extensions.Http.DefaultHttpClientFactory", LogLevel.Warning) |
|
|
|
|
.AddFilter("Microsoft", LogLevel.Warning) |
|
|
|
|
.AddFilter("System", LogLevel.Warning); |
|
|
|
|
builder.SetMinimumLevel(LogLevel.Debug); |
|
|
|
|
#if DEBUG |
|
|
|
|
builder.AddNLog(ConfigureLogging(), |
|
|
|
|
builder.AddNLog( |
|
|
|
|
ConfigureLogging(), |
|
|
|
|
new NLogProviderOptions |
|
|
|
|
{ |
|
|
|
|
IgnoreEmptyEventId = false, |
|
|
|
|
CaptureEventId = EventIdCaptureType.Legacy |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
#else |
|
|
|
|
builder.AddNLog(ConfigureLogging()); |
|
|
|
|
#endif |
|
|
|
@ -573,8 +604,8 @@ public sealed class App : Application
|
|
|
|
|
/// <exception cref="NullReferenceException">If Application.Current is null</exception> |
|
|
|
|
public static void Shutdown(int exitCode = 0) |
|
|
|
|
{ |
|
|
|
|
if (Current is null) throw new NullReferenceException( |
|
|
|
|
"Current Application was null when Shutdown called"); |
|
|
|
|
if (Current is null) |
|
|
|
|
throw new NullReferenceException("Current Application was null when Shutdown called"); |
|
|
|
|
if (Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime) |
|
|
|
|
{ |
|
|
|
|
lifetime.Shutdown(exitCode); |
|
|
|
@ -588,11 +619,9 @@ public sealed class App : Application
|
|
|
|
|
var settingsManager = Services.GetRequiredService<ISettingsManager>(); |
|
|
|
|
|
|
|
|
|
// If RemoveFolderLinksOnShutdown is set, delete all package junctions |
|
|
|
|
if (settingsManager is |
|
|
|
|
{ |
|
|
|
|
IsLibraryDirSet: true, |
|
|
|
|
Settings.RemoveFolderLinksOnShutdown: true |
|
|
|
|
}) |
|
|
|
|
if ( |
|
|
|
|
settingsManager is { IsLibraryDirSet: true, Settings.RemoveFolderLinksOnShutdown: true } |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
var sharedFolders = Services.GetRequiredService<ISharedFolders>(); |
|
|
|
|
sharedFolders.RemoveLinksForAllPackages(); |
|
|
|
@ -615,21 +644,30 @@ public sealed class App : Application
|
|
|
|
|
|
|
|
|
|
ConditionalAddLogViewerNLog(setupBuilder); |
|
|
|
|
|
|
|
|
|
setupBuilder.LoadConfiguration(builder => { |
|
|
|
|
var debugTarget = builder.ForTarget("console").WriteTo(new DebuggerTarget |
|
|
|
|
setupBuilder.LoadConfiguration(builder => |
|
|
|
|
{ |
|
|
|
|
Layout = "${message}" |
|
|
|
|
}).WithAsync(); |
|
|
|
|
var debugTarget = builder |
|
|
|
|
.ForTarget("console") |
|
|
|
|
.WriteTo(new DebuggerTarget { Layout = "${message}" }) |
|
|
|
|
.WithAsync(); |
|
|
|
|
|
|
|
|
|
var fileTarget = builder.ForTarget("logfile").WriteTo(new FileTarget |
|
|
|
|
var fileTarget = builder |
|
|
|
|
.ForTarget("logfile") |
|
|
|
|
.WriteTo( |
|
|
|
|
new FileTarget |
|
|
|
|
{ |
|
|
|
|
Layout = "${longdate}|${level:uppercase=true}|${logger}|${message:withexception=true}", |
|
|
|
|
Layout = |
|
|
|
|
"${longdate}|${level:uppercase=true}|${logger}|${message:withexception=true}", |
|
|
|
|
ArchiveOldFileOnStartup = true, |
|
|
|
|
FileName = "${specialfolder:folder=ApplicationData}/StabilityMatrix/app.log", |
|
|
|
|
ArchiveFileName = "${specialfolder:folder=ApplicationData}/StabilityMatrix/app.{#}.log", |
|
|
|
|
FileName = |
|
|
|
|
"${specialfolder:folder=ApplicationData}/StabilityMatrix/app.log", |
|
|
|
|
ArchiveFileName = |
|
|
|
|
"${specialfolder:folder=ApplicationData}/StabilityMatrix/app.{#}.log", |
|
|
|
|
ArchiveNumbering = ArchiveNumberingMode.Rolling, |
|
|
|
|
MaxArchiveFiles = 2 |
|
|
|
|
}).WithAsync(); |
|
|
|
|
} |
|
|
|
|
) |
|
|
|
|
.WithAsync(); |
|
|
|
|
|
|
|
|
|
// Filter some sources to be warn levels or above only |
|
|
|
|
builder.ForLogger("System.*").WriteToNil(NLog.LogLevel.Warn); |
|
|
|
@ -637,16 +675,17 @@ public sealed class App : Application
|
|
|
|
|
builder.ForLogger("Microsoft.Extensions.Http.*").WriteToNil(NLog.LogLevel.Warn); |
|
|
|
|
|
|
|
|
|
// Disable console trace logging by default |
|
|
|
|
builder.ForLogger("StabilityMatrix.Avalonia.ViewModels.ConsoleViewModel").WriteToNil(NLog.LogLevel.Debug); |
|
|
|
|
builder |
|
|
|
|
.ForLogger("StabilityMatrix.Avalonia.ViewModels.ConsoleViewModel") |
|
|
|
|
.WriteToNil(NLog.LogLevel.Debug); |
|
|
|
|
|
|
|
|
|
builder.ForLogger().FilterMinLevel(NLog.LogLevel.Trace).WriteTo(debugTarget); |
|
|
|
|
builder.ForLogger().FilterMinLevel(NLog.LogLevel.Debug).WriteTo(fileTarget); |
|
|
|
|
|
|
|
|
|
#if DEBUG |
|
|
|
|
var logViewerTarget = builder.ForTarget("DataStoreLogger").WriteTo(new DataStoreLoggerTarget() |
|
|
|
|
{ |
|
|
|
|
Layout = "${message}" |
|
|
|
|
}); |
|
|
|
|
var logViewerTarget = builder |
|
|
|
|
.ForTarget("DataStoreLogger") |
|
|
|
|
.WriteTo(new DataStoreLoggerTarget() { Layout = "${message}" }); |
|
|
|
|
builder.ForLogger().FilterMinLevel(NLog.LogLevel.Trace).WriteTo(logViewerTarget); |
|
|
|
|
#endif |
|
|
|
|
}); |
|
|
|
@ -676,13 +715,19 @@ public sealed class App : Application
|
|
|
|
|
[Conditional("DEBUG")] |
|
|
|
|
private static void ConditionalAddLogViewer(IServiceCollection services) |
|
|
|
|
{ |
|
|
|
|
#if DEBUG |
|
|
|
|
services.AddLogViewer(); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[Conditional("DEBUG")] |
|
|
|
|
private static void ConditionalAddLogViewerNLog(ISetupBuilder setupBuilder) |
|
|
|
|
{ |
|
|
|
|
setupBuilder.SetupExtensions(extensionBuilder => |
|
|
|
|
extensionBuilder.RegisterTarget<DataStoreLoggerTarget>("DataStoreLogger")); |
|
|
|
|
#if DEBUG |
|
|
|
|
setupBuilder.SetupExtensions( |
|
|
|
|
extensionBuilder => |
|
|
|
|
extensionBuilder.RegisterTarget<DataStoreLoggerTarget>("DataStoreLogger") |
|
|
|
|
); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|