NLog 2.1 EventId для EventLog не работает, если не указано

Я использую Nlog 2.1 и пытаюсь записать ошибки в Windows Event logger с другим eventId. Чтобы лучше различать разные ошибки. Если я указываю свойство eventId, оно работает, но если нет, я не вижу никаких записей в Windows Event Logger.

Файл 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();
    }

1 ответ

Решение

Вызов logger.Error("Sample error message"); идет не так как EventLogTarget пытается преобразовать ${event-properties:EventID} в целое число.

Поскольку макет рендеринга в NLog никогда не возвращается null (но string.Empty), это даст исключение - которое будет поймано NLog. Во внутреннем журнале NLog вы должны увидеть FormatException,

Поэтому нам нужно указать значение по умолчанию, вы можете сделать это с помощью whenEmpty:

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

PS: протестировал его с NLog 4.3.11

Другие вопросы по тегам