I am using NLog to log errors. Here is the Config code
<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>
I have a custom property set on the log event like
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
}
and this sets the "color" property.(lets say "Red" here)
and I am trying to use this "color" property in the target like
<highlight-row condition="equals('${color}','Red')" foregroundColor="Red" backgroundColor="NoChange"/>
this dosent work and I tried
<highlight-row condition="equals('${event-context:item=color}','Red')" foregroundColor="Red" backgroundColor="NoChange"/>
but no luck.
Am I missing something or is there a better way of doing this? Can we use Layout renderers in this case? If yes how do we implement this?
First, since you are storing values in LogEventInfo.Properties, you should be using your second configuration example, which gets the value from event-context.
I have not used the ColoredConsoleTarget, so take this as a suggestion, not as something that I know for a fact will work.
I suspect that the NLog Condition object does not know about the ConsoleOutputColor enum. So, when you store a ConsoleOutputColor enum value in LogEventInfo.Properties, the Condition does not know that 'Red' (in the condition) refers to ConsoleOutputColor.Red. I have two suggestions:
First option: store the string value of the ConsoleOutputColor in LogEventInfo.Properties. Using ToColor might be sufficient. Something like this:
var logEvent = new LogEventInfo(level, loggerName, message);
logEvent.Properties["color"] = color.ToString();
Then, in your Condition, you should be able to compare against the ConsoleOutputColor string values (what you have in your configuration might be right, if you store the color name string as I suggested).
If that doesn't work, you could try...
Second option: store the ConsoleOutputColor value in LogEventInfo.Properties, as you are doing now, but change your condition in the config file to compare the "color" from event-context to the numeric value of the ConsoleOutputColor values. Something like this (I have not tried this so I don't know for sure that it is correct):
<highlight-row condition="equals('${event-context:item=color}','12')" foregroundColor="Red" backgroundColor="NoChange"/>
(In the ConsoleOutputColor enum, Red is 12).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With