具有动态连接字符串的 NLog blob 存储扩展

NLog blob storage extension with dynamic connection string

BlobStorage 目标 属性 没有像我预期的那样改变。

我用这个代码。 (当然 le 连接字符串是真正的 azureblobstorage 之一)

LogManager.Configuration.Variables["simple-log-file-name"] = "simple-log.txt";
LogManager.Configuration.Variables["blob-container"] = "logs";
LogManager.Configuration.Variables["blobconst"] = "DefaultEndpointsProtocol=https;AccountName=....";

目标设置在 nlog.config:

<target xsi:type="AzureBlobStorage" name="simple-log-target" blobName="${var:simple-log-file-name}" container="${var:blob-container}" connectionString="${var:blobconst}"....

此时 nlog 无法设置

Error AzureBlobStorageTarget(Name=simple-log-target): Failed to create BlobClient with connectionString=. Exception: System.ArgumentNullException: Value cannot be null. (Parameter 'connectionString')

如果我将 Aure 连接字符串放在 nlog 配置目标中,它会起作用:它写入由 nlog.config 在运行时设置的容器和 blob 中定义的存储。

<target xsi:type="AzureBlobStorage" name="simple-log-target" blobName="${var:simple-log-file-name}" container="${var:blob-container}" connectionString="DefaultEndpointsProtocol=https;AccountName=...." ...

是否可以在运行时定义这个 connectionString?

尝试使用 GDC 而不是使用 NLog-Configuration-Variables:

GlobalDiagnosticsContext.Set("simple-log-file-name", "simple-log.txt");
GlobalDiagnosticsContext.Set("blob-container", "logs");
GlobalDiagnosticsContext.Set("blobconst", "DefaultEndpointsProtocol=https;AccountName=....";

并像这样设置 NLog.config(确保在创建第一个 NLog.Logger 对象之前分配 GDC 值):

<target xsi:type="AzureBlobStorage" name="simple-log-target" blobName="${gdc:simple-log-file-name}" container="${gdc:blob-container}" connectionString="${gdc:blobconst}"

另请参阅:NLog.Extensions.AzureBlobStorage - Azure ConnectionString