Skip to content

Commit 8d86081

Browse files
Update Azure Function diagnostics section
2 parents a33782b + b26e02c commit 8d86081

File tree

9 files changed

+37
-34
lines changed

9 files changed

+37
-34
lines changed

Snippets/ASBFunctionsWorker/ASBFunctionsWorker_1/Configuration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static Task Main()
5858
var containerClient = blobServiceClient.GetBlobContainerClient("diagnostics");
5959
await containerClient.CreateIfNotExistsAsync();
6060

61-
var blobName = $"{DateTime.UtcNow:yyyy-MM-dd-HH-mm-ss-fff}-{endpointName}-configuration.txt";
61+
var blobName = $"{endpointName}-configuration.txt";
6262
var blobClient = containerClient.GetBlobClient(blobName);
6363
await blobClient.UploadAsync(BinaryData.FromString(diagnostics));
6464
});

Snippets/ASBFunctionsWorker/ASBFunctionsWorker_2/Configuration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static Task Main()
5858
var containerClient = blobServiceClient.GetBlobContainerClient("diagnostics");
5959
await containerClient.CreateIfNotExistsAsync();
6060

61-
var blobName = $"{DateTime.UtcNow:yyyy-MM-dd-HH-mm-ss-fff}-{endpointName}-configuration.txt";
61+
var blobName = $"{endpointName}-configuration.txt";
6262
var blobClient = containerClient.GetBlobClient(blobName);
6363
await blobClient.UploadAsync(BinaryData.FromString(diagnostics));
6464
});

Snippets/ASBFunctionsWorker/ASBFunctionsWorker_3/Configuration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static Task Main()
5858
var containerClient = blobServiceClient.GetBlobContainerClient("diagnostics");
5959
await containerClient.CreateIfNotExistsAsync();
6060

61-
var blobName = $"{DateTime.UtcNow:yyyy-MM-dd-HH-mm-ss-fff}-{endpointName}-configuration.txt";
61+
var blobName = $"{endpointName}-configuration.txt";
6262
var blobClient = containerClient.GetBlobClient(blobName);
6363
await blobClient.UploadAsync(BinaryData.FromString(diagnostics));
6464
});

Snippets/ASBFunctionsWorker/ASBFunctionsWorker_4/Configuration.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,16 @@ public static Task Main()
5050
.ConfigureFunctionsWorkerDefaults()
5151
.UseNServiceBus(configuration =>
5252
{
53-
configuration.AdvancedConfiguration.CustomDiagnosticsWriter(async (diagnostics, cancellationToken) =>
53+
configuration.AdvancedConfiguration.CustomDiagnosticsWriter(
54+
async (diagnostics, cancellationToken) =>
5455
{
5556
var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
5657
var blobServiceClient = new BlobServiceClient(connectionString);
5758

5859
var containerClient = blobServiceClient.GetBlobContainerClient("diagnostics");
5960
await containerClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken);
6061

61-
var blobName = $"{DateTime.UtcNow:yyyy-MM-dd-HH-mm-ss-fff}-{endpointName}-configuration.txt";
62+
var blobName = $"{endpointName}-configuration.txt";
6263
var blobClient = containerClient.GetBlobClient(blobName);
6364
await blobClient.UploadAsync(BinaryData.FromString(diagnostics), cancellationToken);
6465
});

Snippets/ASBFunctionsWorker/ASBFunctionsWorker_5/Configuration.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,19 @@ public static Task Main()
5050
.ConfigureFunctionsWorkerDefaults()
5151
.UseNServiceBus(configuration =>
5252
{
53-
configuration.AdvancedConfiguration.CustomDiagnosticsWriter(async (diagnostics, cancellationToken) =>
54-
{
55-
var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
56-
var blobServiceClient = new BlobServiceClient(connectionString);
53+
configuration.AdvancedConfiguration.CustomDiagnosticsWriter(
54+
async (diagnostics, cancellationToken) =>
55+
{
56+
var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
57+
var blobServiceClient = new BlobServiceClient(connectionString);
5758

58-
var containerClient = blobServiceClient.GetBlobContainerClient("diagnostics");
59-
await containerClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken);
59+
var containerClient = blobServiceClient.GetBlobContainerClient("diagnostics");
60+
await containerClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken);
6061

61-
var blobName = $"{DateTime.UtcNow:yyyy-MM-dd-HH-mm-ss-fff}-{endpointName}-configuration.txt";
62-
var blobClient = containerClient.GetBlobClient(blobName);
63-
await blobClient.UploadAsync(BinaryData.FromString(diagnostics), cancellationToken);
64-
});
62+
var blobName = $"{endpointName}-configuration.txt";
63+
var blobClient = containerClient.GetBlobClient(blobName);
64+
await blobClient.UploadAsync(BinaryData.FromString(diagnostics), cancellationToken);
65+
});
6566
})
6667
.Build();
6768
#endregion

Snippets/ASBFunctionsWorker/ASBFunctionsWorker_6/Configuration.cs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,19 @@ public static Task Main()
5050
.ConfigureFunctionsWorkerDefaults()
5151
.UseNServiceBus(configuration =>
5252
{
53-
configuration.AdvancedConfiguration.CustomDiagnosticsWriter(async (diagnostics, cancellationToken) =>
54-
{
55-
var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
56-
var blobServiceClient = new BlobServiceClient(connectionString);
53+
configuration.AdvancedConfiguration.CustomDiagnosticsWriter(
54+
async (diagnostics, cancellationToken) =>
55+
{
56+
var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
57+
var blobServiceClient = new BlobServiceClient(connectionString);
5758

58-
var containerClient = blobServiceClient.GetBlobContainerClient("diagnostics");
59-
await containerClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken);
59+
var containerClient = blobServiceClient.GetBlobContainerClient("diagnostics");
60+
await containerClient.CreateIfNotExistsAsync(cancellationToken: cancellationToken);
6061

61-
var blobName = $"{DateTime.UtcNow:yyyy-MM-dd-HH-mm-ss-fff}-{endpointName}-configuration.txt";
62-
var blobClient = containerClient.GetBlobClient(blobName);
63-
await blobClient.UploadAsync(BinaryData.FromString(diagnostics), cancellationToken);
64-
});
62+
var blobName = $"{endpointName}-configuration.txt";
63+
var blobClient = containerClient.GetBlobClient(blobName);
64+
await blobClient.UploadAsync(BinaryData.FromString(diagnostics), cancellationToken);
65+
});
6566
})
6667
.Build();
6768
#endregion

nservicebus/hosting/azure-functions-service-bus/analyzers.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ Starting in version 4.2, the Azure Functions host package comes with [Roslyn ana
5252
* **Severity**:Error
5353
* **Example message**: The NServiceBus endpoint address in Azure Functions is determined by the ServiceBusTrigger attribute.
5454

55-
### LogDiagnostics is not recommended in Azure Functions
55+
### Default logging with LogDiagnostics will log to the built-in Azure Functions logs
5656

5757
* **Rule ID**: NSBWFUNC018
58-
* **Severity**: Warning
59-
* **Example message**: 'Use 'AdvancedConfiguration.CustomDiagnosticsWriter' for more control over diagnostics output.
58+
* **Severity**: Information
59+
* **Example message**: In Azure Functions, console output to the built-in logs is not persisted and may result in the loss of the diagnostic information. Consider using 'AdvancedConfiguration.CustomDiagnosticsWriter' for more control over diagnostics output.
6060

6161
## Options API
6262

nservicebus/hosting/azure-functions-service-bus/index.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,17 @@ partial: configuration
3434

3535
Unlike the [in-process hosting model](/nservicebus/hosting/azure-functions-service-bus/in-process/), the isolated worker model does not support using [`TransportTransactionMode.SendsAtomicWithReceive`](/transports/transactions.md#transactions-transport-transaction-sends-atomic-with-receive). [`TransportTransactionMode.ReceiveOnly`](/transports/transactions.md#transactions-transport-transaction-receive-only) is the default option.
3636

37-
### Custom diagnostics
37+
### Startup Diagnostics
3838

39-
[NServiceBus startup diagnostics](/nservicebus/hosting/startup-diagnostics.md) are disabled by default when using Azure Functions. Diagnostics can be written to the logs via the `LogDiagnostics` option:
39+
[NServiceBus startup diagnostics](/nservicebus/hosting/startup-diagnostics.md), which help troubleshoot configuration and initialization issues, are disabled by default when using Azure Functions. Diagnostics can be written to the application log file via the `LogDiagnostics()` method and will show up in the [Azure Function log stream](https://learn.microsoft.com/en-us/azure/azure-functions/streaming-logs?tabs=built-in%2Cazure-portal).
4040

4141
snippet: asb-function-isolated-enable-diagnostics
4242

43-
Diagnostics data will be written with logger identification `StartupDiagnostics` with log level *Informational*.
43+
Diagnostics data will be written with logger identification `StartupDiagnostics` with log level *Informational* (`LogLevel.Info`).
4444

45-
#### Azure BLOB Storage
45+
#### Custom Diagnostics Writer
4646

47-
Diagnostic logs can be written to Azure BLOB Storage using `AdvancedConfiguration.CustomDiagnosticsWriter`.
47+
For full control over the diagnostic log output, the `AdvancedConfiguration.CustomDiagnosticsWriter` can be used. This is advantageous when diagnostics need to be persisted beyond the function's execution lifetime or when centralized diagnostic storage is preferred for multiple function instances. As an example, the diagnostics can be written to [Azure BLOB Storage](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-dotnet?tabs=visual-studio%2Cmanaged-identity%2Croles-azure-portal%2Csign-in-azure-cli%2Cidentity-visual-studio&pivots=blob-storage-quickstart-scratch):
4848

4949
snippet: asb-function-iso-diagnostics-blob
5050

nservicebus/hosting/startup-diagnostics.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ reviewed: 2025-03-31
77
---
88

99
> [!NOTE]
10-
> This document does not apply to Azure Function hosts. For Azure Function hosts, see [Azure Function In-process diagnostics](/nservicebus/hosting/azure-functions-service-bus/in-process/#configuration-custom-diagnostics) or [Azure Function Isolated Worker diagnostics](/nservicebus/hosting/azure-functions-service-bus/#configuration-custom-diagnostics).
10+
> This document does not apply to Azure Function hosts. For Azure Function hosts, see [Azure Function In-process diagnostics](/nservicebus/hosting/azure-functions-service-bus/in-process/#configuration-custom-diagnostics) or [Azure Function Isolated Worker diagnostics](/nservicebus/hosting/azure-functions-service-bus/#configuration-startup-diagnostics).
1111
1212
To make troubleshooting easier, diagnostic information is collected during endpoint startup and written to a `.diagnostics` sub-folder in the host output directory.
1313

0 commit comments

Comments
 (0)