diff --git a/Geodatenbezug.Test/GeodiensteApiTest.cs b/Geodatenbezug.Test/GeodiensteApiTest.cs index 945cb56..a6e45a2 100644 --- a/Geodatenbezug.Test/GeodiensteApiTest.cs +++ b/Geodatenbezug.Test/GeodiensteApiTest.cs @@ -99,7 +99,7 @@ public async Task StartExportAsync() new () { Code = HttpStatusCode.OK, Content = "{\"info\":\"Data export successfully started. Call the URL of status_url to get the current status of the export.\"}" }, ]); httpClientFactoryMock.Setup(cf => cf.CreateClient(It.IsAny())).Returns(httpTestMessageHandler.ToHttpClient()).Verifiable(); - loggerMock.Setup(LogLevel.Information, "Starte den Datenexport für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/export.json...", Times.Once()); + loggerMock.Setup(LogLevel.Information, "Starte den Datenexport für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/export.json", Times.Once()); loggerMock.Setup(LogLevel.Information, "Es läuft gerade ein anderer Export. Versuche es in 1 Minute erneut.", Times.Once()); var result = await CreateGeodiensteApiMock().StartExportAsync(topic); @@ -124,7 +124,7 @@ public async Task StartExportAsyncTimeout() new () { Code = HttpStatusCode.NotFound, Content = "{\"error\":\"Cannot start data export because there is another data export pending\"}" }, ]); httpClientFactoryMock.Setup(cf => cf.CreateClient(It.IsAny())).Returns(httpTestMessageHandler.ToHttpClient()).Verifiable(); - loggerMock.Setup(LogLevel.Information, "Starte den Datenexport für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/export.json...", Times.Once()); + loggerMock.Setup(LogLevel.Information, "Starte den Datenexport für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/export.json", Times.Once()); loggerMock.Setup(LogLevel.Information, "Es läuft gerade ein anderer Export. Versuche es in 1 Minute erneut.", Times.Exactly(9)); loggerMock.Setup(LogLevel.Error, "Es läuft bereits ein anderer Export. Zeitlimite überschritten.", Times.Once()); @@ -140,7 +140,7 @@ public async Task StartExportAsyncFails() new () { Code = HttpStatusCode.Unauthorized }, ]); httpClientFactoryMock.Setup(cf => cf.CreateClient(It.IsAny())).Returns(httpTestMessageHandler.ToHttpClient()).Verifiable(); - loggerMock.Setup(LogLevel.Information, "Starte den Datenexport für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/export.json...", Times.Once()); + loggerMock.Setup(LogLevel.Information, "Starte den Datenexport für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/export.json", Times.Once()); var result = await CreateGeodiensteApiMock().StartExportAsync(topic); Assert.AreEqual(HttpStatusCode.Unauthorized, result.StatusCode); @@ -171,7 +171,7 @@ public async Task CheckExportStatusAsync() new () { Code = HttpStatusCode.OK, Content = "{\"status\":\"success\", \"info\":\"Data ready to be downloaded. Provide your credentials to download the data.\", \"download_url\":\"test.com/data.zip\", \"exported_at\":\"2022-03-24T09:31:05.508\"}" }, ]); httpClientFactoryMock.Setup(cf => cf.CreateClient(It.IsAny())).Returns(httpTestMessageHandler.ToHttpClient()).Verifiable(); - loggerMock.Setup(LogLevel.Information, "Prüfe den Status des Datenexports für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/status.json...", Times.Once()); + loggerMock.Setup(LogLevel.Information, "Prüfe den Status des Datenexports für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/status.json", Times.Once()); loggerMock.Setup(LogLevel.Information, "Export ist in der Warteschlange. Versuche es in 1 Minute erneut.", Times.Once()); loggerMock.Setup(LogLevel.Information, "Export ist in Bearbeitung. Versuche es in 1 Minute erneut.", Times.Once()); @@ -198,7 +198,7 @@ public async Task CheckExportStatusAsyncTimeout() new () { Code = HttpStatusCode.OK, Content = "{\"status\":\"working\",\"info\":\"Try again later.\",\"download_url\":null,\"exported_at\":null}" }, ]); httpClientFactoryMock.Setup(cf => cf.CreateClient(It.IsAny())).Returns(httpTestMessageHandler.ToHttpClient()).Verifiable(); - loggerMock.Setup(LogLevel.Information, "Prüfe den Status des Datenexports für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/status.json...", Times.Once()); + loggerMock.Setup(LogLevel.Information, "Prüfe den Status des Datenexports für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/status.json", Times.Once()); loggerMock.Setup(LogLevel.Information, "Export ist in der Warteschlange. Versuche es in 1 Minute erneut.", Times.Exactly(7)); loggerMock.Setup(LogLevel.Information, "Export ist in Bearbeitung. Versuche es in 1 Minute erneut.", Times.Exactly(2)); loggerMock.Setup(LogLevel.Error, "Zeitlimite überschritten. Status ist in Bearbeitung", Times.Once()); @@ -216,7 +216,7 @@ public async Task CheckExportStatusAsyncFails() new () { Code = HttpStatusCode.Unauthorized }, ]); httpClientFactoryMock.Setup(cf => cf.CreateClient(It.IsAny())).Returns(httpTestMessageHandler.ToHttpClient()).Verifiable(); - loggerMock.Setup(LogLevel.Information, "Prüfe den Status des Datenexports für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/status.json...", Times.Once()); + loggerMock.Setup(LogLevel.Information, "Prüfe den Status des Datenexports für Perimeter LN- und Sömmerungsflächen (ZG) mit https://geodienste.ch/downloads/lwb_perimeter_ln_sf/1234567890/status.json", Times.Once()); var result = await CreateGeodiensteApiMock().CheckExportStatusAsync(topic); Assert.AreEqual(HttpStatusCode.Unauthorized, result.StatusCode); @@ -242,7 +242,7 @@ public async Task DownloadExportAsync() var destinationPath = ".\\testresult"; var destinationFile = Path.Combine(destinationPath, "lwb_perimeter_terrassenreben_v2_0_lv95.gpkg"); - loggerMock.Setup(LogLevel.Information, $"Lade die Daten herunter {downloadUrl}...", Times.Once()); + loggerMock.Setup(LogLevel.Information, $"Lade die Daten herunter {downloadUrl}", Times.Once()); var result = await new GeodiensteApi(loggerMock.Object, httpClientFactoryMock.Object).DownloadExportAsync(downloadUrl, destinationPath); Assert.AreEqual(destinationFile, result); @@ -267,7 +267,7 @@ public async Task DownloadExportAsyncNoPackage() var downloadUrl = "http://test.com/test.zip"; var destinationPath = ".\\testresult"; - loggerMock.Setup(LogLevel.Information, $"Lade die Daten herunter {downloadUrl}...", Times.Once()); + loggerMock.Setup(LogLevel.Information, $"Lade die Daten herunter {downloadUrl}", Times.Once()); await Assert.ThrowsExceptionAsync(async () => await new GeodiensteApi(loggerMock.Object, httpClientFactoryMock.Object).DownloadExportAsync(downloadUrl, destinationPath), "Keine GeoPackage-Datei im Archiv gefunden."); } diff --git a/Geodatenbezug.Test/Processors/BewirtschaftungseinheitProcessorTest.cs b/Geodatenbezug.Test/Processors/BewirtschaftungseinheitProcessorTest.cs index d978abb..1e49960 100644 --- a/Geodatenbezug.Test/Processors/BewirtschaftungseinheitProcessorTest.cs +++ b/Geodatenbezug.Test/Processors/BewirtschaftungseinheitProcessorTest.cs @@ -40,7 +40,7 @@ public void Cleanup() [TestMethod] public async Task RunGdalProcessingAsync() { - loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})"); processor.InputDataPath = "testdata\\lwb_bewirtschaftungseinheit_v2_0_lv95_NE_202404191123.gpkg"; await processor.RunGdalProcessingAsync(); diff --git a/Geodatenbezug.Test/Processors/BiodiversitaetsfoerderflaechenProcessorTest.cs b/Geodatenbezug.Test/Processors/BiodiversitaetsfoerderflaechenProcessorTest.cs index 8a441e5..c86993f 100644 --- a/Geodatenbezug.Test/Processors/BiodiversitaetsfoerderflaechenProcessorTest.cs +++ b/Geodatenbezug.Test/Processors/BiodiversitaetsfoerderflaechenProcessorTest.cs @@ -40,7 +40,7 @@ public void Cleanup() [TestMethod] public async Task RunGdalProcessingAsync() { - loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})"); processor.InputDataPath = "testdata\\lwb_biodiversitaetsfoerderflaechen_v2_0_lv95_NE_202404191123.gpkg"; await processor.RunGdalProcessingAsync(); diff --git a/Geodatenbezug.Test/Processors/NutzungsflaechenProcessorTest.cs b/Geodatenbezug.Test/Processors/NutzungsflaechenProcessorTest.cs index 2c9af69..fbe0e38 100644 --- a/Geodatenbezug.Test/Processors/NutzungsflaechenProcessorTest.cs +++ b/Geodatenbezug.Test/Processors/NutzungsflaechenProcessorTest.cs @@ -59,9 +59,9 @@ public async Task PrepareDataAsync() .Setup(api => api.DownloadExportAsync(It.IsAny(), It.IsAny())) .ReturnsAsync("downloadedFilePath"); - loggerMock.Setup(LogLevel.Information, $"Bereite Daten für die Prozessierung von {topic.TopicTitle} ({topic.Canton}) vor..."); - loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})..."); - loggerMock.Setup(LogLevel.Information, $"Exportiere {bewirtschaftungseinheitTopic.TopicTitle} ({bewirtschaftungseinheitTopic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Bereite Daten für die Prozessierung von {topic.TopicTitle} ({topic.Canton}) vor"); + loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})"); + loggerMock.Setup(LogLevel.Information, $"Exportiere {bewirtschaftungseinheitTopic.TopicTitle} ({bewirtschaftungseinheitTopic.Canton})"); await processor.PrepareDataAsync(); geodiensteApiMock.Verify(api => api.StartExportAsync(topic), Times.Once); @@ -73,8 +73,8 @@ public async Task PrepareDataAsync() [TestMethod] public async Task RunGdalProcessingAsync() { - loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})..."); - loggerMock.Setup(LogLevel.Information, $"Lade Nutzungsart-Katalog von https://models.geo.admin.ch/BLW/LWB_Nutzungsflaechen_Kataloge_V2_0.xml..."); + loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})"); + loggerMock.Setup(LogLevel.Information, $"Lade Nutzungsart-Katalog von https://models.geo.admin.ch/BLW/LWB_Nutzungsflaechen_Kataloge_V2_0.xml"); processor.InputDataPath = "testdata\\lwb_nutzungsflaechen_v2_0_lv95_NE_202404191123.gpkg"; processor.BewirtschaftungseinheitDataPath = "testdata\\lwb_bewirtschaftungseinheit_v2_0_lv95_NE_202404191123.gpkg"; diff --git a/Geodatenbezug.Test/Processors/PerimeterLnSfProcessorTest.cs b/Geodatenbezug.Test/Processors/PerimeterLnSfProcessorTest.cs index e780075..da7be65 100644 --- a/Geodatenbezug.Test/Processors/PerimeterLnSfProcessorTest.cs +++ b/Geodatenbezug.Test/Processors/PerimeterLnSfProcessorTest.cs @@ -40,7 +40,7 @@ public void Cleanup() [TestMethod] public async Task RunGdalProcessingAsync() { - loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})"); processor.InputDataPath = "testdata\\lwb_perimeter_ln_sf_v2_0_lv95_NE_202404191123.gpkg"; await processor.RunGdalProcessingAsync(); diff --git a/Geodatenbezug.Test/Processors/PerimeterTerrassenrebenProcessorTest.cs b/Geodatenbezug.Test/Processors/PerimeterTerrassenrebenProcessorTest.cs index 030e6c9..497afff 100644 --- a/Geodatenbezug.Test/Processors/PerimeterTerrassenrebenProcessorTest.cs +++ b/Geodatenbezug.Test/Processors/PerimeterTerrassenrebenProcessorTest.cs @@ -40,7 +40,7 @@ public void Cleanup() [TestMethod] public async Task RunGdalProcessingAsync() { - loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})"); processor.InputDataPath = "testdata\\lwb_perimeter_terrassenreben_v2_0_lv95_NE_202404191123.gpkg"; await processor.RunGdalProcessingAsync(); diff --git a/Geodatenbezug.Test/Processors/RebbaukatasterProcessorTest.cs b/Geodatenbezug.Test/Processors/RebbaukatasterProcessorTest.cs index 470d137..f4db7e1 100644 --- a/Geodatenbezug.Test/Processors/RebbaukatasterProcessorTest.cs +++ b/Geodatenbezug.Test/Processors/RebbaukatasterProcessorTest.cs @@ -40,7 +40,7 @@ public void Cleanup() [TestMethod] public async Task RunGdalProcessingAsync() { - loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})"); processor.InputDataPath = "testdata\\lwb_rebbaukataster_v2_0_lv95_NE_202404191123.gpkg"; await processor.RunGdalProcessingAsync(); diff --git a/Geodatenbezug.Test/Processors/TopicProcessorTest.cs b/Geodatenbezug.Test/Processors/TopicProcessorTest.cs index b642790..ec3e81f 100644 --- a/Geodatenbezug.Test/Processors/TopicProcessorTest.cs +++ b/Geodatenbezug.Test/Processors/TopicProcessorTest.cs @@ -56,7 +56,7 @@ public async Task ExportTopic() geodiensteApiMock .Setup(api => api.CheckExportStatusAsync(It.IsAny())) .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("{\"status\":\"success\", \"info\":\"Data ready to be downloaded. Provide your credentials to download the data.\", \"download_url\":\"test.com/data.zip\", \"exported_at\":\"2022-03-24T09:31:05.508\"}"), }); - loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})"); var result = await Processor.ExportTopicAsync(topic); @@ -80,7 +80,7 @@ public async Task ExportTopicOnlyOneExportIn24h() geodiensteApiMock .Setup(api => api.CheckExportStatusAsync(It.IsAny())) .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("{\"status\":\"success\", \"info\":\"Data ready to be downloaded. Provide your credentials to download the data.\", \"download_url\":\"test.com/data.zip\", \"exported_at\":\"2022-03-24T09:31:05.508\"}"), }); - loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})"); var result = await Processor.ExportTopicAsync(topic); @@ -103,7 +103,7 @@ public async Task ExportTopicStartExportFails() geodiensteApiMock .Setup(api => api.StartExportAsync(It.IsAny())) .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("{\"error\":\"Data export information not found. Invalid token?\"}"), }); - loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})"); loggerMock.Setup(LogLevel.Error, $"Fehler beim Starten des Exports für Thema {topic.TopicTitle} ({topic.Canton}): {HttpStatusCode.NotFound} - Data export information not found. Invalid token?"); await Assert.ThrowsExceptionAsync(async () => await Processor.ExportTopicAsync(topic), "Export failed"); @@ -130,7 +130,7 @@ public async Task ExportTopicCheckExportStatusFailed() geodiensteApiMock .Setup(api => api.CheckExportStatusAsync(It.IsAny())) .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("{\"status\":\"failed\", \"info\":\"An unexpected error occurred. Please try again by starting a new data export.\"}"), }); - loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})"); loggerMock.Setup(LogLevel.Error, $"Fehler bei der Statusabfrage des Datenexports für Thema {topic.TopicTitle} ({topic.Canton}): An unexpected error occurred. Please try again by starting a new data export."); await Assert.ThrowsExceptionAsync(async () => await Processor.ExportTopicAsync(topic), "Export failed"); @@ -158,7 +158,7 @@ public async Task ExportTopicCheckExportStatusError() geodiensteApiMock .Setup(api => api.CheckExportStatusAsync(It.IsAny())) .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("{\"error\":\"Data export information not found. Invalid token?\"}"), }); - loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Exportiere {topic.TopicTitle} ({topic.Canton})"); loggerMock.Setup(LogLevel.Error, $"Fehler bei der Statusabfrage des Datenexports für Thema {topic.TopicTitle} ({topic.Canton}): {HttpStatusCode.NotFound} - Data export information not found. Invalid token?"); await Assert.ThrowsExceptionAsync(async () => await Processor.ExportTopicAsync(topic), "Export failed"); @@ -183,7 +183,7 @@ public async Task PrepareDataFails() processorMock.Setup(p => p.PrepareDataAsync()) .Throws(new InvalidOperationException("Something happened", new InvalidOperationException("Inner exception details"))); - loggerMock.Setup(LogLevel.Information, $"Verarbeite Thema {topic.TopicTitle} ({topic.Canton})..."); + loggerMock.Setup(LogLevel.Information, $"Verarbeite Thema {topic.TopicTitle} ({topic.Canton})"); loggerMock.Setup(LogLevel.Error, $"Fehler beim Verarbeiten des Themas {topic.TopicTitle} ({topic.Canton}): Something happened"); await Processor.ProcessAsync(); diff --git a/Geodatenbezug/AzureStorage.cs b/Geodatenbezug/AzureStorage.cs index b89ffc6..0d0ceb7 100644 --- a/Geodatenbezug/AzureStorage.cs +++ b/Geodatenbezug/AzureStorage.cs @@ -17,7 +17,7 @@ public class AzureStorage(ILogger logger) : IAzureStorage /// public async Task UploadFileAsync(string storageFilePath, string localFilePath) { - logger.LogInformation($"Lade Datei {localFilePath} in den Azure Storage hoch..."); + logger.LogInformation($"Lade Datei {localFilePath} in den Azure Storage hoch"); var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage"); if (string.IsNullOrEmpty(connectionString)) { @@ -30,7 +30,7 @@ public async Task UploadFileAsync(string storageFilePath, string localFi using var localFileStream = File.OpenRead(localFilePath); await blobClient.UploadAsync(localFileStream).ConfigureAwait(false); - logger.LogInformation($"Erstelle DownloadUrl für Datei {localFilePath}..."); + logger.LogInformation($"Erstelle DownloadUrl für Datei {localFilePath}"); var sasBuilder = new BlobSasBuilder { BlobContainerName = StorageContainerName, diff --git a/Geodatenbezug/Geodatenbezug.cs b/Geodatenbezug/Geodatenbezug.cs index 8927e7d..3837fbd 100644 --- a/Geodatenbezug/Geodatenbezug.cs +++ b/Geodatenbezug/Geodatenbezug.cs @@ -25,7 +25,7 @@ public class Geodatenbezug(ILoggerFactory loggerFactory, Processor processing) [Function(nameof(OrchestrateProcessing))] public async Task OrchestrateProcessing([OrchestrationTrigger] TaskOrchestrationContext context) { - logger.LogInformation("Start der Prozessierung..."); + logger.LogInformation("Start der Prozessierung"); var topics = await context.CallActivityAsync>(nameof(RetrieveTopics)).ConfigureAwait(true); var results = new List(); foreach (var topic in topics) @@ -46,7 +46,7 @@ public async Task OrchestrateProcessing([OrchestrationTrigger] TaskOrchestration [Function(nameof(RetrieveTopics))] public async Task?> RetrieveTopics([ActivityTrigger] string param) { - logger.LogInformation("Laden der Themen..."); + logger.LogInformation("Laden der Themen"); return await processing.GetTopicsToProcess().ConfigureAwait(false); } diff --git a/Geodatenbezug/GeodiensteApi.cs b/Geodatenbezug/GeodiensteApi.cs index 000ad11..da9a041 100644 --- a/Geodatenbezug/GeodiensteApi.cs +++ b/Geodatenbezug/GeodiensteApi.cs @@ -50,7 +50,7 @@ public async Task StartExportAsync(Topic topic) { var token = GetToken(topic.BaseTopic, topic.Canton); var url = $"{GeodiensteBaseUrl}/downloads/{topic.BaseTopic}/{token}/export.json"; - logger.LogInformation($"Starte den Datenexport für {topic.TopicTitle} ({topic.Canton}) mit {url}..."); + logger.LogInformation($"Starte den Datenexport für {topic.TopicTitle} ({topic.Canton}) mit {url}"); using var httpClient = httpClientFactory.CreateClient(nameof(GeodiensteApi)); var retryPolicy = Policy @@ -72,11 +72,11 @@ public async Task StartExportAsync(Topic topic) var errorResponse = JsonSerializer.Deserialize(jsonString); if (retryCount < 10) { - logger.LogInformation("Es läuft gerade ein anderer Export. Versuche es in 1 Minute erneut."); + logger.LogInformation($"{topic.TopicTitle} ({topic.Canton}): Es läuft gerade ein anderer Export. Versuche es in 1 Minute erneut."); } else { - logger.LogError("Es läuft bereits ein anderer Export. Zeitlimite überschritten."); + logger.LogError($"{topic.TopicTitle} ({topic.Canton}): Es läuft bereits ein anderer Export. Zeitlimite überschritten."); } }); @@ -91,7 +91,7 @@ public async Task CheckExportStatusAsync(Topic topic) { var token = GetToken(topic.BaseTopic, topic.Canton); var url = $"{GeodiensteBaseUrl}/downloads/{topic.BaseTopic}/{token}/status.json"; - logger.LogInformation($"Prüfe den Status des Datenexports für {topic.TopicTitle} ({topic.Canton}) mit {url}..."); + logger.LogInformation($"Prüfe den Status des Datenexports für {topic.TopicTitle} ({topic.Canton}) mit {url}"); using var httpClient = httpClientFactory.CreateClient(nameof(GeodiensteApi)); var retryPolicy = Policy @@ -114,11 +114,11 @@ public async Task CheckExportStatusAsync(Topic topic) var statusString = statusResponse.Status == GeodiensteStatus.Queued ? "in der Warteschlange" : "in Bearbeitung"; if (retryCount < 10) { - logger.LogInformation($"Export ist {statusString}. Versuche es in 1 Minute erneut."); + logger.LogInformation($"{topic.TopicTitle} ({topic.Canton}): Export ist {statusString}. Versuche es in 1 Minute erneut."); } else { - logger.LogError($"Zeitlimite überschritten. Status ist {statusString}"); + logger.LogError($"{topic.TopicTitle} ({topic.Canton}): Zeitlimite überschritten. Status ist {statusString}"); } }); @@ -131,7 +131,7 @@ public async Task CheckExportStatusAsync(Topic topic) /// public async Task DownloadExportAsync(string downloadUrl, string destinationPath) { - logger.LogInformation($"Lade die Daten herunter {downloadUrl}..."); + logger.LogInformation($"Lade die Daten herunter {downloadUrl}"); Directory.CreateDirectory(destinationPath); var downloadedFilePath = string.Empty; using var httpClient = httpClientFactory.CreateClient(nameof(GeodiensteApi)); diff --git a/Geodatenbezug/Processors/NutzungsflaechenProcessor.cs b/Geodatenbezug/Processors/NutzungsflaechenProcessor.cs index f220612..bd3343c 100644 --- a/Geodatenbezug/Processors/NutzungsflaechenProcessor.cs +++ b/Geodatenbezug/Processors/NutzungsflaechenProcessor.cs @@ -26,7 +26,7 @@ public class NutzungsflaechenProcessor(IGeodiensteApi geodiensteApi, IAzureStora /// protected internal override async Task PrepareDataAsync() { - Logger.LogInformation($"Bereite Daten für die Prozessierung von {Topic.TopicTitle} ({Topic.Canton}) vor..."); + Logger.LogInformation($"Bereite Daten für die Prozessierung von {Topic.TopicTitle} ({Topic.Canton}) vor"); var exportInputTopic = PrepareTopic(Topic); @@ -243,7 +243,7 @@ private async Task CreateNutzungsartLayerAsync() private async Task> GetLnfKatalogNutzungsartAsync() { - Logger.LogInformation($"Lade Nutzungsart-Katalog von {CatalogUrl}..."); + Logger.LogInformation($"Lade Nutzungsart-Katalog von {CatalogUrl}"); using var httpClient = new HttpClient(); var xmlData = await httpClient.GetStringAsync(CatalogUrl).ConfigureAwait(false); diff --git a/Geodatenbezug/Processors/TopicProcessor.cs b/Geodatenbezug/Processors/TopicProcessor.cs index 53f5d81..f35f53f 100644 --- a/Geodatenbezug/Processors/TopicProcessor.cs +++ b/Geodatenbezug/Processors/TopicProcessor.cs @@ -67,12 +67,13 @@ public async Task ProcessAsync() { try { - logger.LogInformation($"Verarbeite Thema {topic.TopicTitle} ({topic.Canton})..."); + logger.LogInformation($"Verarbeite Thema {topic.TopicTitle} ({topic.Canton})"); await PrepareDataAsync().ConfigureAwait(false); await RunGdalProcessingAsync().ConfigureAwait(false); + logger.LogInformation($"Zippe Resultate für {topic.TopicTitle} ({topic.Canton})"); var zipFileName = $"{Path.GetFileName(dataDirectory)}_{Topic.Canton}_{DateTime.Now.ToString("yyyyMMddHHmm", new CultureInfo("de-CH"))}.zip"; var zipFileDirectory = Path.GetDirectoryName(DataDirectory) ?? throw new InvalidOperationException("Invalid data directory"); var zipFullFilePath = Path.Combine(zipFileDirectory, zipFileName); @@ -105,7 +106,7 @@ public async Task ProcessAsync() /// protected internal virtual async Task PrepareDataAsync() { - logger.LogInformation($"Bereite Daten für die Prozessierung von {topic.TopicTitle} ({topic.Canton}) vor..."); + logger.LogInformation($"Bereite Daten für die Prozessierung von {topic.TopicTitle} ({topic.Canton}) vor"); var downloadUrl = await ExportTopicAsync(topic).ConfigureAwait(false); InputDataPath = await GeodiensteApi.DownloadExportAsync(downloadUrl, DataDirectory).ConfigureAwait(false); } @@ -115,7 +116,7 @@ protected internal virtual async Task PrepareDataAsync() /// protected internal async Task ExportTopicAsync(Topic topic) { - logger.LogInformation($"Exportiere {topic.TopicTitle} ({topic.Canton})..."); + logger.LogInformation($"Exportiere {topic.TopicTitle} ({topic.Canton})"); var exportResponse = await GeodiensteApi.StartExportAsync(topic).ConfigureAwait(false); if (!exportResponse.IsSuccessStatusCode) @@ -176,7 +177,7 @@ protected internal async Task ExportTopicAsync(Topic topic) /// protected internal async Task RunGdalProcessingAsync() { - logger.LogInformation($"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})..."); + logger.LogInformation($"Starte GDAL-Prozessierung von Thema {topic.TopicTitle} ({topic.Canton})"); Ogr.RegisterAll(); Ogr.UseExceptions(); diff --git a/README.md b/README.md index 4f8e70f..065f33d 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,17 @@ Dieses Projekt implementiert einen automatisierten Datenintegrationsprozess für landwirtschaftliche Geodaten, die von der Plattform geodienste.ch bereitgestellt werden. +## Log abfragen + +Um im Azure Portal die relevanten Logs inkl. Exceptions abzufragen, kann folgende Query ausgeführt werden: + +``` +traces +| where customDimensions.CategoryName startswith "Geodatenbezug." +| union exceptions +| where customDimensions.CategoryName startswith "Geodatenbezug." +``` + ## Einrichten der Entwicklungsumgebung Folgende Komponenten müssen auf dem Entwicklungsrechner installiert sein: