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?.LogInformation("Opened database {path}", path);
if (options.ExpirationScanFrequency > TimeSpan.Zero)

View file

@ -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<string>("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);
}
}
}

View file

@ -44,6 +44,9 @@ namespace MapControl
public ImageSource ImageSource { get; set; }
}
private static ILogger logger;
private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger<GroundOverlay>());
public static readonly DependencyProperty SourcePathProperty =
DependencyPropertyHelper.Register<GroundOverlay, string>(nameof(SourcePath), null,
async (groundOverlay, oldValue, newValue) => await groundOverlay.LoadAsync(newValue));
@ -84,7 +87,7 @@ namespace MapControl
}
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();
logger = loggerFactory?.CreateLogger<ImageFileCache>();
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)

View file

@ -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;

View file

@ -31,6 +31,9 @@ namespace MapControl
public partial class TileImageLoader : ITileImageLoader
{
private static ILogger logger;
private static ILogger Logger => logger ?? (logger = ImageLoader.LoggerFactory?.CreateLogger<TileImageLoader>());
/// <summary>
/// Default folder path where a persistent cache implementation may save data, i.e. "C:\ProgramData\MapControl\TileCache".
/// </summary>
@ -69,9 +72,6 @@ namespace MapControl
/// </summary>
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 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

View file

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

View file

@ -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");

View file

@ -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();

View file

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

View file

@ -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");

View file

@ -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");