Вопрос:
Я использую NLog для регистрации ошибок. Вот код конфигурации
<target name=»console» xsi:type=»AsyncWrapper» > <target xsi:type=»ColoredConsole» layout=»${longdate:padding=-10}${callsite:className=false:includeSourcePath=false:methodName=false} | ${message}» > <highlight-row condition=»level >= LogLevel.Info» foregroundColor=»Green» backgroundColor=»NoChange»/> </target> </target>
У меня есть настраиваемый набор свойств в событии журнала, например
private LogEventInfo GetLogEvent(string loggerName, LogLevel level, string message, ConsoleColor color) { var logEvent = new LogEventInfo(level, loggerName, message); logEvent.Properties[«color»] = color;// color= any console color }
и это устанавливает свойство “color” (здесь, например, “Красный” )
и я пытаюсь использовать это свойство “color” в целевом объекте, например
<highlight-row condition=»equals(‘${color}’,’Red’)» foregroundColor=»Red» backgroundColor=»NoChange»/>
эта работа с дозатором, и я попробовал
<highlight-row condition=»equals(‘${event-context:item=color}’,’Red’)» foregroundColor=»Red» backgroundColor=»NoChange»/>
но не повезло.
Я что-то упустил или есть лучший способ сделать это? Можем ли мы использовать средства визуализации макета в этом случае? Если да, то как это реализовать?
Лучший ответ:
Во-первых, поскольку вы сохраняете значения в LogEventInfo.Properties, вы должны использовать второй пример конфигурации, который получает значение от event-context.
Я не использовал ColoredConsoleTarget, поэтому сделайте это как предложение, а не как то, что я знаю для факта, будет работать.
Я подозреваю, что объект NLog Condition не знает о перечислении ConsoleOutputColor. Итак, когда вы сохраняете значение enum ConsoleOutputColor в LogEventInfo.Properties, Condition не знает, что ‘Red’ (в условии) относится к ConsoleOutputColor.Red. У меня есть два предложения:
Первая опция: сохранить строковое значение ConsoleOutputColor в LogEventInfo.Properties. Использовать ToColor может быть достаточно. Что-то вроде этого:
var logEvent = new LogEventInfo(level, loggerName, message); logEvent.Properties[«color»] = color.ToString();
Затем, в вашем Condition, вы должны иметь возможность сравнивать с строковыми значениями ConsoleOutputColor (то, что у вас есть в вашей конфигурации, может быть правильным, если вы сохраните строку имени цвета, как я предложил).
Если это не работает, вы можете попробовать…
Вторая опция: сохраните значение ConsoleOutputColor в LogEventInfo.Properties, как вы сейчас делаете, но измените условие в файле конфигурации, чтобы сравнить “цвет” от контекста события с числовым значением ConsoleOutputColor значения. Что-то вроде этого (я не пробовал это, поэтому я не знаю точно, что это правильно):
<highlight-row condition=»equals(‘${event-context:item=color}’,’12’)» foregroundColor=»Red» backgroundColor=»NoChange»/>
(В перечислении ConsoleOutputColor Red есть 12).