NLog彩色控制台

时间:2012-10-27 23:41:45

标签: asp.net c#-4.0 console nlog

我正在使用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
}

并设置“颜色”属性。(这里说“红色”)

我试图在目标中使用这个“颜色”属性,如

 <highlight-row condition="equals('${color}','Red')" foregroundColor="Red" backgroundColor="NoChange"/> 

这个剂量工作,我试过

<highlight-row condition="equals('${event-context:item=color}','Red')" foregroundColor="Red" backgroundColor="NoChange"/> 

但没有运气。

我错过了什么或有更好的方法吗?在这种情况下我们可以使用布局渲染器吗?如果是,我们如何实现这个?

1 个答案:

答案 0 :(得分:2)

首先,由于您要在LogEventInfo.Properties中存储值,因此您应该使用第二个配置示例,该示例从event-context获取值。

我没有使用过ColoredConsoleTarget,所以请将此作为一个建议,而不是我所知道的事实可行。

我怀疑NLog Condition对象不知道ConsoleOutputColor枚举。因此,当您在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为{{1}})。