未指定时,EventLog 的 NLog 2.1 EventId 不起作用

NLog 2.1 EventId for EventLog not working when not specified

我正在使用 Nlog 2.1 并尝试将错误写入具有不同 eventId 的 Windows 事件记录器。为了更好的区分不同的错误。 如果我指定 eventId 属性 它正在工作,但如果不指定,我在 Windows 事件记录器中看不到任何记录。

NLog.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<targets>

<target name="console" xsi:type="ColoredConsole"
        layout="${date:format=HH\:mm\:ss}|${level:uppercase=true}|${message}" />

<target xsi:type="EventLog"
    name="eventlog"
    layout="{${newline}
    &quot;Logger&quot;: &quot;${logger}&quot;,${newline}
    &quot;StackTrace&quot;: &quot;${stacktrace}&quot;,${newline}
    &quot;Message&quot;: &quot;${message}&quot;,${newline}
    &quot;Exception&quot;: &quot;${exception:format=ToString,Data}&quot;${newline}}"
    machineName="."
    source="CareFusion Analytics Agent Service"
    eventId="${event-properties:EventID}"
    log="Application" />
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="console" />
    <logger name="*" minlevel="Error" writeTo="eventlog" />
  </rules>
</nlog>

用法:

private static void Main(string[] args)
    {
        Logger logger = LogManager.GetCurrentClassLogger();

        logger.Error("Sample error message"); //This is not working

        LogEventInfo logEvent = new LogEventInfo()
        {
            Level = LogLevel.Error,
            Message = "Hello",                
            LoggerName = logger.Name

        };
        logEvent.Properties.Add("EventID", 400);

        logger.Log(logEvent);  //This is working


        Console.WriteLine("Press any key....");
        Console.ReadKey();
    }

调用 logger.Error("Sample error message"); 出错,因为 EventLogTarget 试图将 ${event-properties:EventID} 转换为整数。

因为 NLog 中的布局从不呈现 return null(但 string.Empty),这将给出一个异常 - 它将被 NLog 捕获。在 NLog's internal log 中你应该看到 FormatException.

所以我们需要指定一个默认值,你可以用 whenEmpty:

<target xsi:type="EventLog"
        ...
        eventId="${event-properties:EventID:whenEmpty=0}"  /> 

PS: 使用 NLog 4.3.11

测试