From 2d97f1f2c7bf65fe940e2bd642d28aec4e1dd277 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Fri, 22 Aug 2025 11:06:37 +0200 Subject: [PATCH] Improved logging --- Caches/SQLiteCache/SQLiteCache.cs | 1 - MapControl/Shared/GeoImage.cs | 5 ++++- MapControl/Shared/GroundOverlay.cs | 5 ++++- MapControl/Shared/ImageFileCache.cs | 9 ++++----- MapControl/Shared/ImageLoader.cs | 16 +++++++++++----- MapControl/Shared/TileImageLoader.cs | 12 ++++++------ MapControl/Shared/WmtsTileLayer.cs | 5 ++++- MapControl/WinUI/ImageLoader.WinUI.cs | 2 +- SampleApps/AvaloniaApp/MainWindow.axaml.cs | 7 ++++--- SampleApps/UniversalApp/MainPage.xaml.cs | 9 ++++++++- SampleApps/UniversalApp/UniversalApp.csproj | 3 +++ SampleApps/WinUiApp/MainWindow.xaml.cs | 7 ++++--- SampleApps/WpfApplication/MainWindow.xaml.cs | 7 ++++--- 13 files changed, 57 insertions(+), 31 deletions(-) diff --git a/Caches/SQLiteCache/SQLiteCache.cs b/Caches/SQLiteCache/SQLiteCache.cs index 5923f468..28ecf52e 100644 --- a/Caches/SQLiteCache/SQLiteCache.cs +++ b/Caches/SQLiteCache/SQLiteCache.cs @@ -60,7 +60,6 @@ namespace MapControl.Caching } logger = loggerFactory?.CreateLogger(); - logger?.LogInformation("Opened database {path}", path); if (options.ExpirationScanFrequency > TimeSpan.Zero) diff --git a/MapControl/Shared/GeoImage.cs b/MapControl/Shared/GeoImage.cs index b2e3a18b..28c13475 100644 --- a/MapControl/Shared/GeoImage.cs +++ b/MapControl/Shared/GeoImage.cs @@ -82,6 +82,9 @@ namespace MapControl private static string QueryString(ushort tag) => $"/ifd/{{ushort={tag}}}"; + private static ILogger logger; + private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger(nameof(GeoImage))); + public static readonly DependencyProperty SourcePathProperty = DependencyPropertyHelper.RegisterAttached("SourcePath", typeof(GeoImage), null, async (element, oldValue, newValue) => await LoadGeoImageAsync(element, newValue)); @@ -136,7 +139,7 @@ namespace MapControl } catch (Exception ex) { - ImageLoader.LoggerFactory?.CreateLogger(typeof(GeoImage))?.LogError(ex, "Failed loading from {path}", sourcePath); + Logger?.LogError(ex, "Failed loading from {path}", sourcePath); } } } diff --git a/MapControl/Shared/GroundOverlay.cs b/MapControl/Shared/GroundOverlay.cs index 39f95a38..7803ae64 100644 --- a/MapControl/Shared/GroundOverlay.cs +++ b/MapControl/Shared/GroundOverlay.cs @@ -44,6 +44,9 @@ namespace MapControl public ImageSource ImageSource { get; set; } } + private static ILogger logger; + private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger()); + public static readonly DependencyProperty SourcePathProperty = DependencyPropertyHelper.Register(nameof(SourcePath), null, async (groundOverlay, oldValue, newValue) => await groundOverlay.LoadAsync(newValue)); @@ -84,7 +87,7 @@ namespace MapControl } catch (Exception ex) { - ImageLoader.LoggerFactory?.CreateLogger()?.LogError(ex, "Failed loading from {path}", sourcePath); + Logger?.LogError(ex, "Failed loading from {path}", sourcePath); } } diff --git a/MapControl/Shared/ImageFileCache.cs b/MapControl/Shared/ImageFileCache.cs index 751669ac..ad461065 100644 --- a/MapControl/Shared/ImageFileCache.cs +++ b/MapControl/Shared/ImageFileCache.cs @@ -49,7 +49,6 @@ namespace MapControl.Caching rootDirectory.Create(); logger = loggerFactory?.CreateLogger(); - logger?.LogInformation("Started in {name}", rootDirectory.FullName); var memoryCacheOptions = new MemoryDistributedCacheOptions(); @@ -91,7 +90,7 @@ namespace MapControl.Caching memoryCache.Set(key, value, options); - logger?.LogTrace("Read {name}", file.FullName); + logger?.LogDebug("Read {name}", file.FullName); } } catch (Exception ex) @@ -126,7 +125,7 @@ namespace MapControl.Caching await memoryCache.SetAsync(key, value, options, token).ConfigureAwait(false); - logger?.LogTrace("Read {name}", file.FullName); + logger?.LogDebug("Read {name}", file.FullName); } } catch (Exception ex) @@ -160,7 +159,7 @@ namespace MapControl.Caching SetExpiration(file, options); - logger?.LogTrace("Wrote {name}", file.FullName); + logger?.LogDebug("Wrote {name}", file.FullName); } } catch (Exception ex) @@ -191,7 +190,7 @@ namespace MapControl.Caching SetExpiration(file, options); - logger?.LogTrace("Wrote {name}", file.FullName); + logger?.LogDebug("Wrote {name}", file.FullName); } } catch (Exception ex) diff --git a/MapControl/Shared/ImageLoader.cs b/MapControl/Shared/ImageLoader.cs index fa05efdb..3d3a3ba8 100644 --- a/MapControl/Shared/ImageLoader.cs +++ b/MapControl/Shared/ImageLoader.cs @@ -27,7 +27,7 @@ namespace MapControl static ImageLoader() { - HttpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30) }; + HttpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(10) }; HttpClient.DefaultRequestHeaders.Add("User-Agent", $"XAML-Map-Control/{typeof(ImageLoader).Assembly.GetName().Version}"); } @@ -59,7 +59,7 @@ namespace MapControl } catch (Exception ex) { - Logger?.LogError(ex, "Failed loading image from {uri}", uri); + Logger?.LogError(ex, "Failed loading {uri}", uri); } progress?.Report(1d); @@ -93,7 +93,9 @@ namespace MapControl try { - using (var responseMessage = await HttpClient.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false)) + var completionOptions = progress != null ? HttpCompletionOption.ResponseHeadersRead : HttpCompletionOption.ResponseContentRead; + + using (var responseMessage = await HttpClient.GetAsync(uri, completionOptions).ConfigureAwait(false)) { if (responseMessage.IsSuccessStatusCode) { @@ -112,13 +114,17 @@ namespace MapControl } else { - Logger?.LogWarning("{uri}: {status} {reason}", uri, (int)responseMessage.StatusCode, responseMessage.ReasonPhrase); + Logger?.LogWarning("{status} ({reason}) from {uri}", (int)responseMessage.StatusCode, responseMessage.ReasonPhrase, uri); } } } + catch (TaskCanceledException) + { + Logger?.LogWarning("Timeout while loading {uri}", uri); + } catch (Exception ex) { - Logger?.LogError(ex, "Failed loading image from {uri}", uri); + Logger?.LogError(ex, "Failed loading {uri}", uri); } return response; diff --git a/MapControl/Shared/TileImageLoader.cs b/MapControl/Shared/TileImageLoader.cs index c52a3ec0..58a2e4e2 100644 --- a/MapControl/Shared/TileImageLoader.cs +++ b/MapControl/Shared/TileImageLoader.cs @@ -31,6 +31,9 @@ namespace MapControl public partial class TileImageLoader : ITileImageLoader { + private static ILogger logger; + private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger()); + /// /// Default folder path where a persistent cache implementation may save data, i.e. "C:\ProgramData\MapControl\TileCache". /// @@ -69,9 +72,6 @@ namespace MapControl /// public static int MaxLoadTasks { get; set; } = 4; - private static ILogger logger; - private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger()); - private readonly ConcurrentStack tileStack = new ConcurrentStack(); private int tileCount; private int taskCount; @@ -98,14 +98,14 @@ namespace MapControl while (taskCount < maxTasks) { Interlocked.Increment(ref taskCount); - Logger?.LogTrace("Task count: {count}", taskCount); + Logger?.LogDebug("Task count: {count}", taskCount); _ = Task.Run(async () => { await LoadTilesFromStack(tileSource, cacheName, progress).ConfigureAwait(false); Interlocked.Decrement(ref taskCount); - Logger?.LogTrace("Task count: {count}", taskCount); + Logger?.LogDebug("Task count: {count}", taskCount); }); } } @@ -125,7 +125,7 @@ namespace MapControl progress?.Report((double)tileNumber / tileCount); - Logger?.LogTrace("Loading tile {number} of {count} ({zoom}/{column}/{row}) in thread {thread}", + Logger?.LogDebug("Loading tile {number} of {count} ({zoom}/{column}/{row}) in thread {thread}", tileNumber, tileCount, tile.ZoomLevel, tile.Column, tile.Row, Environment.CurrentManagedThreadId); try diff --git a/MapControl/Shared/WmtsTileLayer.cs b/MapControl/Shared/WmtsTileLayer.cs index a1678883..779d78ed 100644 --- a/MapControl/Shared/WmtsTileLayer.cs +++ b/MapControl/Shared/WmtsTileLayer.cs @@ -22,6 +22,9 @@ namespace MapControl /// public class WmtsTileLayer : MapTileLayerBase { + private static ILogger logger; + private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger()); + public static readonly DependencyProperty CapabilitiesUriProperty = DependencyPropertyHelper.Register(nameof(CapabilitiesUri), null, (layer, oldValue, newValue) => layer.TileMatrixSets.Clear()); @@ -202,7 +205,7 @@ namespace MapControl } catch (Exception ex) { - ImageLoader.LoggerFactory?.CreateLogger()?.LogError(ex, "Failed reading capabilities from {uri}", CapabilitiesUri); + Logger?.LogError(ex, "Failed reading capabilities from {uri}", CapabilitiesUri); } } } diff --git a/MapControl/WinUI/ImageLoader.WinUI.cs b/MapControl/WinUI/ImageLoader.WinUI.cs index 848e3f0c..e73315d8 100644 --- a/MapControl/WinUI/ImageLoader.WinUI.cs +++ b/MapControl/WinUI/ImageLoader.WinUI.cs @@ -89,7 +89,7 @@ namespace MapControl } catch (Exception ex) { - Logger?.LogError(ex, "{uri}", uri); + Logger?.LogError(ex, "Failed loading {uri}", uri); } progress.Report(1d); diff --git a/SampleApps/AvaloniaApp/MainWindow.axaml.cs b/SampleApps/AvaloniaApp/MainWindow.axaml.cs index 97adeda1..26441c0f 100644 --- a/SampleApps/AvaloniaApp/MainWindow.axaml.cs +++ b/SampleApps/AvaloniaApp/MainWindow.axaml.cs @@ -13,13 +13,14 @@ namespace SampleApplication { public MainWindow() { - var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug()); - ImageLoader.LoggerFactory = loggerFactory; + //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, + // LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information))); - //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory); //TileImageLoader.Cache = tileCache; //Closed += (s, e) => tileCache.Dispose(); + ImageLoader.LoggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Warning)); + InitializeComponent(); sampleOverlayMenuItem.MapLayerFactory = async () => await GroundOverlay.CreateAsync("etna.kml"); diff --git a/SampleApps/UniversalApp/MainPage.xaml.cs b/SampleApps/UniversalApp/MainPage.xaml.cs index 3fa5c13d..f6f27e01 100644 --- a/SampleApps/UniversalApp/MainPage.xaml.cs +++ b/SampleApps/UniversalApp/MainPage.xaml.cs @@ -1,4 +1,5 @@ using MapControl; +using Microsoft.Extensions.Logging; using System; using System.Diagnostics; using System.Globalization; @@ -15,7 +16,13 @@ namespace SampleApplication { public MainPage() { - //TileImageLoader.Cache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder); + //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, + // LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information))); + + //TileImageLoader.Cache = tileCache; + //Unloaded += (s, e) => tileCache.Dispose(); + + ImageLoader.LoggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Warning)); InitializeComponent(); diff --git a/SampleApps/UniversalApp/UniversalApp.csproj b/SampleApps/UniversalApp/UniversalApp.csproj index 0ec2f9c6..d0cd42b3 100644 --- a/SampleApps/UniversalApp/UniversalApp.csproj +++ b/SampleApps/UniversalApp/UniversalApp.csproj @@ -108,6 +108,9 @@ + + 9.0.8 + 6.2.14 diff --git a/SampleApps/WinUiApp/MainWindow.xaml.cs b/SampleApps/WinUiApp/MainWindow.xaml.cs index 734ba6f2..688f37fe 100644 --- a/SampleApps/WinUiApp/MainWindow.xaml.cs +++ b/SampleApps/WinUiApp/MainWindow.xaml.cs @@ -16,13 +16,14 @@ namespace SampleApplication { public MainWindow() { - var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug()); - ImageLoader.LoggerFactory = loggerFactory; + //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, + // LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information))); - //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory); //TileImageLoader.Cache = tileCache; //Closed += (s, e) => tileCache.Dispose(); + ImageLoader.LoggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Warning)); + InitializeComponent(); sampleOverlayMenuItem.MapLayerFactory = async () => await GroundOverlay.CreateAsync("etna.kml"); diff --git a/SampleApps/WpfApplication/MainWindow.xaml.cs b/SampleApps/WpfApplication/MainWindow.xaml.cs index 308ac714..7cbf7d47 100644 --- a/SampleApps/WpfApplication/MainWindow.xaml.cs +++ b/SampleApps/WpfApplication/MainWindow.xaml.cs @@ -14,13 +14,14 @@ namespace SampleApplication { public MainWindow() { - var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug()); - ImageLoader.LoggerFactory = loggerFactory; + //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, + // LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information))); - //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory); //TileImageLoader.Cache = tileCache; //Closed += (s, e) => tileCache.Dispose(); + ImageLoader.LoggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Warning)); + InitializeComponent(); sampleOverlayMenuItem.MapLayerFactory = async () => await GroundOverlay.CreateAsync("etna.kml");