未指定时,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}
"Logger": "${logger}",${newline}
"StackTrace": "${stacktrace}",${newline}
"Message": "${message}",${newline}
"Exception": "${exception:format=ToString,Data}"${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
测试
我正在使用 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}
"Logger": "${logger}",${newline}
"StackTrace": "${stacktrace}",${newline}
"Message": "${message}",${newline}
"Exception": "${exception:format=ToString,Data}"${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
测试