Как фильтровать, используя условие в NLog с C # - PullRequest
0 голосов
/ 20 мая 2019

У меня проблема с созданием целевого фильтра NLog в C #. Я пытаюсь создать фильтр для входа в две разные цели. У меня это работает с условием на основе содержимого сообщения, содержащего соответствующую строку. Проблема в том, что я не могу заставить условие работать с именем машины или контекстом события.

Это будет работать, как и ожидалось, с использованием самого сообщения:

var newRule = new LoggingRule("*", logLevel, someWrapper);
newRule.DefaultFilterResult = FilterResult.Ignore;
newRule.Filters.Add(new ConditionBasedFilter()
{
    Condition = "contains(message, 'string')",
    Action = FilterResult.Log
});
config.LoggingRules.Add(newRule);

Это не работает:

Condition = "contains(machinename, 'string')"
Condition = "equals(machinename, 'string')"
Condition = "machinename == 'string')"
Condition = "contains(event-context:item=SomeItem, 'string')"
Condition = "equals(event-context:item=SomeItem, 'string')"
Condition = "event-context:item=SomeItem == 'string')"

Ошибка, которую я увижу для вышеупомянутого, будет:

"Неожиданный токен: ==" ИЛИ "Неожиданный токен:,"

Я не уверен, что у меня неправильный формат, может быть? Я пробовал несколько разных вариантов, но я просто не могу заставить условный фильтр работать с именем машины или, более конкретно, с контекстом события.

Спасибо за ваше время и помощь!

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

В условиях вы можете использовать средства визуализации макета, но вам нужен синтаксис ${...},

, поэтому это будет работать:

Condition = "contains(${machinename}, 'string')"
Condition = "equals(${machinename}, 'string')"
Condition = "${machinename} == 'string'"
Condition = "contains(${event-context:item=SomeItem}, 'string')"
Condition = "equals(${event-context:item=SomeItem}, 'string')"
Condition = "${event-context:item=SomeItem} == 'string'"

См. Также документы условийв NLog

Условный язык Выражения фильтра написаны на специальном мини-языке.Язык состоит из:

  • реляционных операторов: ==,! =, <, <=,> = И>
    • Примечание. Возможно, необходимо экранировать некоторые предопределенные символы XML.Например, если вы попытаетесь использовать символ «<», синтаксический анализатор XML будет интерпретировать его как открывающий тег, что приведет к ошибке в файле конфигурации.Вместо этого используйте экранированную версию '<' (<) в этом контексте. </li>
  • логические операторы: и, или, не
  • строковые литералы, которые всегда оцениваются какмакеты - $ {somerenderer}
  • логические литералы - true и false
  • числовые литералы - например, 12345 (целочисленный литерал) и 12345.678 (литерал с плавающей запятой)
  • литералы уровня журнала -LogLevel.Trace, LogLevel.Debug, ... LogLevel.Fatal
  • предопределенные ключевые слова для доступа к наиболее распространенным свойствам событий журнала - уровень, сообщение и регистратор
  • фигурные скобки - для переопределения приоритетов по умолчанию и группывыражения вместе
  • условные функции - для выполнения строковых и объектных тестов
  • Одиночные кавычки следует экранировать еще одной одинарной кавычкой.

Все возможные средства визуализации макета могутможно найти здесь https://nlog -project.org / config (вкладка layout-renderers)

Официальные документы по фильтрации в NLog можно найти здесь: https://github.com/NLog/NLog/wiki/Filtering-log-messages

0 голосов
/ 20 мая 2019

Что вам не хватает в вашем состоянии, так это несколько одинарных кавычек.

var stringToCompare = "sometext";
var stringCondition = "'${machinename}' == '" + stringToCompare + "'";

...

newRule.Filters.Add(new ConditionBasedFilter()
{
    Condition = stringCondition,
    Action = FilterResult.Log
});
...