Improved logging

This commit is contained in:
ClemensFischer 2025-08-22 11:06:37 +02:00
parent fce05c2ed1
commit 2d97f1f2c7
13 changed files with 57 additions and 31 deletions

View file

@ -60,7 +60,6 @@ namespace MapControl.Caching
} }
logger = loggerFactory?.CreateLogger<SQLiteCache>(); logger = loggerFactory?.CreateLogger<SQLiteCache>();
logger?.LogInformation("Opened database {path}", path); logger?.LogInformation("Opened database {path}", path);
if (options.ExpirationScanFrequency > TimeSpan.Zero) if (options.ExpirationScanFrequency > TimeSpan.Zero)

View file

@ -82,6 +82,9 @@ namespace MapControl
private static string QueryString(ushort tag) => $"/ifd/{{ushort={tag}}}"; 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 = public static readonly DependencyProperty SourcePathProperty =
DependencyPropertyHelper.RegisterAttached<string>("SourcePath", typeof(GeoImage), null, DependencyPropertyHelper.RegisterAttached<string>("SourcePath", typeof(GeoImage), null,
async (element, oldValue, newValue) => await LoadGeoImageAsync(element, newValue)); async (element, oldValue, newValue) => await LoadGeoImageAsync(element, newValue));
@ -136,7 +139,7 @@ namespace MapControl
} }
catch (Exception ex) catch (Exception ex)
{ {
ImageLoader.LoggerFactory?.CreateLogger(typeof(GeoImage))?.LogError(ex, "Failed loading from {path}", sourcePath); Logger?.LogError(ex, "Failed loading from {path}", sourcePath);
} }
} }
} }

View file

@ -44,6 +44,9 @@ namespace MapControl
public ImageSource ImageSource { get; set; } public ImageSource ImageSource { get; set; }
} }
private static ILogger logger;
private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger<GroundOverlay>());
public static readonly DependencyProperty SourcePathProperty = public static readonly DependencyProperty SourcePathProperty =
DependencyPropertyHelper.Register<GroundOverlay, string>(nameof(SourcePath), null, DependencyPropertyHelper.Register<GroundOverlay, string>(nameof(SourcePath), null,
async (groundOverlay, oldValue, newValue) => await groundOverlay.LoadAsync(newValue)); async (groundOverlay, oldValue, newValue) => await groundOverlay.LoadAsync(newValue));
@ -84,7 +87,7 @@ namespace MapControl
} }
catch (Exception ex) catch (Exception ex)
{ {
ImageLoader.LoggerFactory?.CreateLogger<GroundOverlay>()?.LogError(ex, "Failed loading from {path}", sourcePath); Logger?.LogError(ex, "Failed loading from {path}", sourcePath);
} }
} }

View file

@ -49,7 +49,6 @@ namespace MapControl.Caching
rootDirectory.Create(); rootDirectory.Create();
logger = loggerFactory?.CreateLogger<ImageFileCache>(); logger = loggerFactory?.CreateLogger<ImageFileCache>();
logger?.LogInformation("Started in {name}", rootDirectory.FullName); logger?.LogInformation("Started in {name}", rootDirectory.FullName);
var memoryCacheOptions = new MemoryDistributedCacheOptions(); var memoryCacheOptions = new MemoryDistributedCacheOptions();
@ -91,7 +90,7 @@ namespace MapControl.Caching
memoryCache.Set(key, value, options); memoryCache.Set(key, value, options);
logger?.LogTrace("Read {name}", file.FullName); logger?.LogDebug("Read {name}", file.FullName);
} }
} }
catch (Exception ex) catch (Exception ex)
@ -126,7 +125,7 @@ namespace MapControl.Caching
await memoryCache.SetAsync(key, value, options, token).ConfigureAwait(false); await memoryCache.SetAsync(key, value, options, token).ConfigureAwait(false);
logger?.LogTrace("Read {name}", file.FullName); logger?.LogDebug("Read {name}", file.FullName);
} }
} }
catch (Exception ex) catch (Exception ex)
@ -160,7 +159,7 @@ namespace MapControl.Caching
SetExpiration(file, options); SetExpiration(file, options);
logger?.LogTrace("Wrote {name}", file.FullName); logger?.LogDebug("Wrote {name}", file.FullName);
} }
} }
catch (Exception ex) catch (Exception ex)
@ -191,7 +190,7 @@ namespace MapControl.Caching
SetExpiration(file, options); SetExpiration(file, options);
logger?.LogTrace("Wrote {name}", file.FullName); logger?.LogDebug("Wrote {name}", file.FullName);
} }
} }
catch (Exception ex) catch (Exception ex)

View file

@ -27,7 +27,7 @@ namespace MapControl
static ImageLoader() 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}"); HttpClient.DefaultRequestHeaders.Add("User-Agent", $"XAML-Map-Control/{typeof(ImageLoader).Assembly.GetName().Version}");
} }
@ -59,7 +59,7 @@ namespace MapControl
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger?.LogError(ex, "Failed loading image from {uri}", uri); Logger?.LogError(ex, "Failed loading {uri}", uri);
} }
progress?.Report(1d); progress?.Report(1d);
@ -93,7 +93,9 @@ namespace MapControl
try 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) if (responseMessage.IsSuccessStatusCode)
{ {
@ -112,13 +114,17 @@ namespace MapControl
} }
else 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) catch (Exception ex)
{ {
Logger?.LogError(ex, "Failed loading image from {uri}", uri); Logger?.LogError(ex, "Failed loading {uri}", uri);
} }
return response; return response;

View file

@ -31,6 +31,9 @@ namespace MapControl
public partial class TileImageLoader : ITileImageLoader public partial class TileImageLoader : ITileImageLoader
{ {
private static ILogger logger;
private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger<TileImageLoader>());
/// <summary> /// <summary>
/// Default folder path where a persistent cache implementation may save data, i.e. "C:\ProgramData\MapControl\TileCache". /// Default folder path where a persistent cache implementation may save data, i.e. "C:\ProgramData\MapControl\TileCache".
/// </summary> /// </summary>
@ -69,9 +72,6 @@ namespace MapControl
/// </summary> /// </summary>
public static int MaxLoadTasks { get; set; } = 4; public static int MaxLoadTasks { get; set; } = 4;
private static ILogger logger;
private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger<TileImageLoader>());
private readonly ConcurrentStack<Tile> tileStack = new ConcurrentStack<Tile>(); private readonly ConcurrentStack<Tile> tileStack = new ConcurrentStack<Tile>();
private int tileCount; private int tileCount;
private int taskCount; private int taskCount;
@ -98,14 +98,14 @@ namespace MapControl
while (taskCount < maxTasks) while (taskCount < maxTasks)
{ {
Interlocked.Increment(ref taskCount); Interlocked.Increment(ref taskCount);
Logger?.LogTrace("Task count: {count}", taskCount); Logger?.LogDebug("Task count: {count}", taskCount);
_ = Task.Run(async () => _ = Task.Run(async () =>
{ {
await LoadTilesFromStack(tileSource, cacheName, progress).ConfigureAwait(false); await LoadTilesFromStack(tileSource, cacheName, progress).ConfigureAwait(false);
Interlocked.Decrement(ref taskCount); 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); 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); tileNumber, tileCount, tile.ZoomLevel, tile.Column, tile.Row, Environment.CurrentManagedThreadId);
try try

View file

@ -22,6 +22,9 @@ namespace MapControl
/// </summary> /// </summary>
public class WmtsTileLayer : MapTileLayerBase public class WmtsTileLayer : MapTileLayerBase
{ {
private static ILogger logger;
private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger<WmtsTileLayer>());
public static readonly DependencyProperty CapabilitiesUriProperty = public static readonly DependencyProperty CapabilitiesUriProperty =
DependencyPropertyHelper.Register<WmtsTileLayer, Uri>(nameof(CapabilitiesUri), null, DependencyPropertyHelper.Register<WmtsTileLayer, Uri>(nameof(CapabilitiesUri), null,
(layer, oldValue, newValue) => layer.TileMatrixSets.Clear()); (layer, oldValue, newValue) => layer.TileMatrixSets.Clear());
@ -202,7 +205,7 @@ namespace MapControl
} }
catch (Exception ex) catch (Exception ex)
{ {
ImageLoader.LoggerFactory?.CreateLogger<WmtsTileLayer>()?.LogError(ex, "Failed reading capabilities from {uri}", CapabilitiesUri); Logger?.LogError(ex, "Failed reading capabilities from {uri}", CapabilitiesUri);
} }
} }
} }

View file

@ -89,7 +89,7 @@ namespace MapControl
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger?.LogError(ex, "{uri}", uri); Logger?.LogError(ex, "Failed loading {uri}", uri);
} }
progress.Report(1d); progress.Report(1d);

View file

@ -13,13 +13,14 @@ namespace SampleApplication
{ {
public MainWindow() public MainWindow()
{ {
var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug()); //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder,
ImageLoader.LoggerFactory = loggerFactory; // LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information)));
//var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
//TileImageLoader.Cache = tileCache; //TileImageLoader.Cache = tileCache;
//Closed += (s, e) => tileCache.Dispose(); //Closed += (s, e) => tileCache.Dispose();
ImageLoader.LoggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Warning));
InitializeComponent(); InitializeComponent();
sampleOverlayMenuItem.MapLayerFactory = async () => await GroundOverlay.CreateAsync("etna.kml"); sampleOverlayMenuItem.MapLayerFactory = async () => await GroundOverlay.CreateAsync("etna.kml");

View file

@ -1,4 +1,5 @@
using MapControl; using MapControl;
using Microsoft.Extensions.Logging;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization; using System.Globalization;
@ -15,7 +16,13 @@ namespace SampleApplication
{ {
public MainPage() 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(); InitializeComponent();

View file

@ -108,6 +108,9 @@
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Debug">
<Version>9.0.8</Version>
</PackageReference>
<PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform"> <PackageReference Include="Microsoft.NETCore.UniversalWindowsPlatform">
<Version>6.2.14</Version> <Version>6.2.14</Version>
</PackageReference> </PackageReference>

View file

@ -16,13 +16,14 @@ namespace SampleApplication
{ {
public MainWindow() public MainWindow()
{ {
var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug()); //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder,
ImageLoader.LoggerFactory = loggerFactory; // LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information)));
//var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
//TileImageLoader.Cache = tileCache; //TileImageLoader.Cache = tileCache;
//Closed += (s, e) => tileCache.Dispose(); //Closed += (s, e) => tileCache.Dispose();
ImageLoader.LoggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Warning));
InitializeComponent(); InitializeComponent();
sampleOverlayMenuItem.MapLayerFactory = async () => await GroundOverlay.CreateAsync("etna.kml"); sampleOverlayMenuItem.MapLayerFactory = async () => await GroundOverlay.CreateAsync("etna.kml");

View file

@ -14,13 +14,14 @@ namespace SampleApplication
{ {
public MainWindow() public MainWindow()
{ {
var loggerFactory = LoggerFactory.Create(builder => builder.AddDebug()); //var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder,
ImageLoader.LoggerFactory = loggerFactory; // LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Information)));
//var tileCache = new MapControl.Caching.ImageFileCache(TileImageLoader.DefaultCacheFolder, loggerFactory);
//TileImageLoader.Cache = tileCache; //TileImageLoader.Cache = tileCache;
//Closed += (s, e) => tileCache.Dispose(); //Closed += (s, e) => tileCache.Dispose();
ImageLoader.LoggerFactory = LoggerFactory.Create(builder => builder.AddDebug().SetMinimumLevel(LogLevel.Warning));
InitializeComponent(); InitializeComponent();
sampleOverlayMenuItem.MapLayerFactory = async () => await GroundOverlay.CreateAsync("etna.kml"); sampleOverlayMenuItem.MapLayerFactory = async () => await GroundOverlay.CreateAsync("etna.kml");