NLog 跟踪目标仅适用于跟踪和调试级别,不适用于信息、警告、错误或致命级别
NLog trace target only works right for trace and debug levels, not info, warn, error, or fatal
请注意,我正在回答我自己的问题以帮助将来的人。
当我使用 NLog 记录到跟踪目标类型时,它只有在级别为 Trace
或 Debug
时才能正常工作。如果它是 Info
、Warn
或 Error
,它会在我的布局之前添加额外的信息。如果级别是 Fatal
,我会收到一个弹出窗口,抱怨失败的断言,它在输出中也是如此。跟踪目标是否被窃听?
Program.cs
using System;
namespace TraceLoggingTest
{
class Program
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
logger.Trace("Hello Trace");
logger.Debug("Hello Debug");
logger.Info("Hello Info");
logger.Warn("Hello Warn");
logger.Error("Hello Error");
logger.Fatal("Hello Fatal");
Console.ReadLine();
NLog.LogManager.Shutdown();
}
}
}
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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<targets>
<target name="logTrace" xsi:type="Trace" layout="${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logTrace" />
</rules>
</nlog>
预期输出
Hello Trace
Hello Debug
Hello Info
Hello Warn
Hello Error
Hello Fatal
实际产量
Hello Trace
Hello Debug
TraceLoggingTest.exe Information: 0 : Hello Info
TraceLoggingTest.exe Warning: 0 : Hello Warn
TraceLoggingTest.exe Error: 0 : Hello Error
---- DEBUG ASSERTION FAILED ----
---- Assert Short Message ----
Hello Fatal
---- Assert Long Message ----
Nlog 4.5 中引入了对前置问题的修复。您需要将 rawWrite="true"
添加到目标语句中。它也恰好解决了断言问题。
变化:
<target name="logTrace" xsi:type="Trace" layout="${message}" />
为此:
<target name="logTrace" xsi:type="Trace" layout="${message}" rawWrite="true" />
来自https://github.com/NLog/NLog/wiki/Trace-target:
Layout Options
rawWrite - Always use Trace.WriteLine
independent of LogLevel. Default: False
Introduced with NLog 4.5, fixes the issue with output being prefixed with exe-filename.
这里有两个对原问题的讨论:
请注意,我正在回答我自己的问题以帮助将来的人。
当我使用 NLog 记录到跟踪目标类型时,它只有在级别为 Trace
或 Debug
时才能正常工作。如果它是 Info
、Warn
或 Error
,它会在我的布局之前添加额外的信息。如果级别是 Fatal
,我会收到一个弹出窗口,抱怨失败的断言,它在输出中也是如此。跟踪目标是否被窃听?
Program.cs
using System;
namespace TraceLoggingTest
{
class Program
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
logger.Trace("Hello Trace");
logger.Debug("Hello Debug");
logger.Info("Hello Info");
logger.Warn("Hello Warn");
logger.Error("Hello Error");
logger.Fatal("Hello Fatal");
Console.ReadLine();
NLog.LogManager.Shutdown();
}
}
}
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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<targets>
<target name="logTrace" xsi:type="Trace" layout="${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logTrace" />
</rules>
</nlog>
预期输出
Hello Trace
Hello Debug
Hello Info
Hello Warn
Hello Error
Hello Fatal
实际产量
Hello Trace
Hello Debug
TraceLoggingTest.exe Information: 0 : Hello Info
TraceLoggingTest.exe Warning: 0 : Hello Warn
TraceLoggingTest.exe Error: 0 : Hello Error
---- DEBUG ASSERTION FAILED ----
---- Assert Short Message ----
Hello Fatal
---- Assert Long Message ----
Nlog 4.5 中引入了对前置问题的修复。您需要将 rawWrite="true"
添加到目标语句中。它也恰好解决了断言问题。
变化:
<target name="logTrace" xsi:type="Trace" layout="${message}" />
为此:
<target name="logTrace" xsi:type="Trace" layout="${message}" rawWrite="true" />
来自https://github.com/NLog/NLog/wiki/Trace-target:
Layout Options
rawWrite - Always use
Trace.WriteLine
independent of LogLevel.Default: False
Introduced with NLog 4.5, fixes the issue with output being prefixed with exe-filename.
这里有两个对原问题的讨论: