Как настроить строку подключения таблицы Azure для NLog с помощью переменных параметров? - PullRequest
0 голосов
/ 06 февраля 2019

У меня проблема с записью журналов в таблицу Azure с использованием Nlog, но строка подключения может меняться в зависимости от среды (например, 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 голосов
/ 06 февраля 2019

Попробуйте сделать это вместо:

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>
...