API конфигурации NLog: использование макетов, хранящихся в переменных - PullRequest
3 голосов
/ 09 марта 2012

Мое приложение создает журнал для самого приложения, поэтому запишите, когда оно было активировано, и что произошло на уровне приложения.

Приложение сосредоточено вокруг «профилей» - пользователь загружает профиль, который сообщаетприложение где / когда / что / как.Поэтому я также хочу создать журнал для каждого профиля, чтобы записывать прогресс при каждом запуске профиля.

Пока никаких проблем ... за исключением того, что я хочу, чтобы журнал профиля сохранялся вместе с самим профилем.Это означает, что мне нужно настроить NLog динамически, чтобы я мог указать ему путь fileTarget во время выполнения.

Однако я также хотел сохранить стандартные макеты, которые я хочу использовать, в качестве переменных в NLog.config.;кажется, это достаточно распространенный подход из того, что я прочитал.

Однако в следующей строке

fileTarget.Layout = "${myLayout}"

... я получаю ArgumentException:

LayoutRenderer cannot be found: 'myLayout'

На данный момент моя переменная макета просто:

<variable name="myLayout" value="${message}" />

Это тот случай, когда вы не можете использовать переменные для задания макета через API?Я был бы удивлен, если бы это было так.Или я где-то ошибся?

Решение достаточно простое - я могу заполнить fileTarget.Layout указанным вручную макетом, но, тем не менее, мне интересно узнать, может ли План А работать.

Ответы [ 2 ]

6 голосов
/ 18 марта 2015

Я получил последний исходный код (NLog 3.2.0.0) и нашел решение, которое поддерживается без каких-либо изменений в NLog.Код ниже получает значение переменной.Я предполагаю, что это также может быть записано, но я не пробовал это, потому что мне не нужны эти функции.Это отвечает на вопрос.Последняя строка оценивает текст в переменной, чтобы отобразить любые средства визуализации макета, которые он содержит.

var config = (NLog.Config.XmlLoggingConfiguration)LogManager.Configuration;
string dir = config.Variables["logDirectory"];
dir = NLog.Layouts.SimpleLayout.Evaluate(dir);
2 голосов
/ 10 марта 2012

Это невозможно, если вы используете скомпилированный двоичный файл с сайта NLog, в основном потому, что NLog не предоставляет API для доступа к <variable> элементам.

Вы можете предложить автору добавить эту возможность,ИЛИ, если вы действительно заинтересованы в этой возможности, загрузите и измените исходный код.private string ExpandVariables(string input) в файле XmlLoggingConfiguration.cs - это то, что вам нужно раскрыть.

Удачи.

...