如何使用“设置”变量为NLog配置Azure表连接字符串?

时间:2019-02-06 14:59:32

标签: c# .net azure asp.net-core nlog

我有一个问题,我需要使用Nlog将日志写入Azure表,但是连接字符串可能会根据环境(即Dev / UAT等)而变化,因此我需要从另一个配置文件中获取该字符串。我的Nlog“目标”部分当前如下所示:

<targets>
<target xsi:type="File" name="allfile" fileName="${var:configDir}\nlog-all.log"
        layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}" />
    <target xsi:type="AzureTableStorage"
        connectionString="${var:myNLogConnectionString}"
        name="NLogAzureTable"
        layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}"            
        tableName="MyTestLogs"
        logTimeStampFormat="O" />
</targets>

我的Api如下所示:

ILoggerFactory logger = new LoggerFactory().AddNLog();
var nlogConfigSection = config.Settings.Sections["MyService_NlogSettings"];
LogManager.LoadConfiguration("nlog.config");
LogManager.Configuration = new XmlLoggingConfiguration("nlog.config");

LogManager.Configuration.Variables["configDir"] = nlogConfigSection.Parameters["FileLocation"].Value;
LogManager.Configuration.Variables["myNLogConnectionString"] = nlogConfigSection.Parameters["environmentNLogConnectionString"].Value;

从调试中我可以看到,所有config.settings值均已按需检索,甚至还适当地填充了配置中的变量。我发现,如果我在本地写入“ allfile”文本文件,那么它将设法检索并填充“ configDir”,因为这是文本文件出现的地方! 但是,如果切换到使用Azure,则可以看到如前所述,该变量是在配置中设置的,但是当我查看Nlog内部日志文件时,可以看到它认为连接字符串为空。

在这里我做错了什么吗?!我已经看到了类似问题的解决方案,但它们似乎总是涉及做我已经做过的事情,但是我没有任何快乐!

1 个答案:

答案 0 :(得分:2)

尝试执行以下操作:

ILoggerFactory logger = new LoggerFactory().AddNLog();
var nlogConfigSection = config.Settings.Sections["MyService_NlogSettings"];

// Configure global settings before loading NLog.config
NLog.GlobalDiagnosticsContext.Set("configDir", nlogConfigSection.Parameters["FileLocation"].Value); 
NLog.GlobalDiagnosticsContext.Set("myNLogConnectionString", nlogConfigSection.Parameters["environmentNLogConnectionString"].Value); 

NLog.LogManager.Configuration = new XmlLoggingConfiguration("nlog.config");

使用以下NLog.config,将${var替换为${gdc

<targets>
<target xsi:type="File" name="allfile" fileName="${var:configDir}\nlog-all.log"
        layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}" />
    <target xsi:type="AzureTableStorage"
        connectionString="${gdc:myNLogConnectionString}"
        name="NLogAzureTable"
        layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}"            
        tableName="MyTestLogs"
        logTimeStampFormat="O" />
</targets>