gpt4 book ai didi

c# - nlog:使用 "Trace"输出使 Logger.Error() 抛出异常 - 如何修复?

转载 作者:行者123 更新时间:2023-12-03 16:59:36 27 4
gpt4 key购买 nike

我正在使用 NLog 进行日志记录。我正在尝试设置一种将内容输出到 System.Diagnostics.Trace() 的方法,因此我按如下方式设置了 NLog.config 文件:


<targets>
<target name="debugOutput" xsi:type="Trace" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="debugOutput" />
</rules>

这适用于除 Error() 和 Fatal() 之外的所有日志记录级别。

例如,以下代码:
private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
...
_logger.Trace("Sample trace message\n");
_logger.Debug("Sample debug message\n");
_logger.Info("Sample informational message\n");
_logger.Warn("Sample warning message\n");
_logger.Error("Sample error message\n");
_logger.Fatal("Sample fatal error message\n");

当 _logger.Error() 和 _logger.Fatal() 被调用时抛出异常:
2012-09-28 12:08:04.9296|DEBUG|ClassLibraryUsingNLog.Test|Sample debug message

2012-09-28 12:08:04.9636|INFO|ClassLibraryUsingNLog.Test|Sample informational message

2012-09-28 12:08:04.9906|WARN|ClassLibraryUsingNLog.Test|Sample warning message

---- DEBUG ASSERTION FAILED ----
---- Assert Short Message ----
2012-09-28 12:08:05.0176|ERROR|ClassLibraryUsingNLog.Test|Sample error message

---- Assert Long Message ----

at NLog.Targets.TraceTarget.Write(LogEventInfo logEvent)
at NLog.Targets.Target.Write(AsyncLogEventInfo logEvent)
at NLog.Targets.Target.WriteAsyncLogEvent(AsyncLogEventInfo logEvent)
at NLog.LoggerImpl.WriteToTargetWithFilterChain(TargetWithFilterChain targetListHead, LogEventInfo logEvent, AsyncContinuation onException)
at NLog.LoggerImpl.Write(Type loggerType, TargetWithFilterChain targets, LogEventInfo logEvent, LogFactory factory)
at NLog.Logger.WriteToTargets[T](LogLevel level, IFormatProvider formatProvider, T value)
at NLog.Logger.Error(String message)
at ClassLibraryUsingNLog.Test.Func() in c:\Test\CS4.x\ClassLibraryUsingNLog\Test.cs:line 15
at ConsoleAppIndirectlyUsesNLog.Program.Main(String[] args) in C:\Test\CS4.x\ConsoleAppIndirectlyUsesNLog\Program.cs:line 11

First-chance exception at 0x7686b9bc in ConsoleAppIndirectlyUsesNLog.exe: Microsoft C++ exception: EEMessageException at memory location 0x0053e8d4..
---- DEBUG ASSERTION FAILED ----
---- Assert Short Message ----
2012-09-28 12:08:06.7936|FATAL|ClassLibraryUsingNLog.Test|Sample fatal error message

---- Assert Long Message ----

at NLog.Targets.TraceTarget.Write(LogEventInfo logEvent)
at NLog.Targets.Target.Write(AsyncLogEventInfo logEvent)
at NLog.Targets.Target.WriteAsyncLogEvent(AsyncLogEventInfo logEvent)
at NLog.LoggerImpl.WriteToTargetWithFilterChain(TargetWithFilterChain targetListHead, LogEventInfo logEvent, AsyncContinuation onException)
at NLog.LoggerImpl.Write(Type loggerType, TargetWithFilterChain targets, LogEventInfo logEvent, LogFactory factory)
at NLog.Logger.WriteToTargets[T](LogLevel level, IFormatProvider formatProvider, T value)
at NLog.Logger.Fatal(String message)
at ClassLibraryUsingNLog.Test.Func() in c:\Test\CS4.x\ClassLibraryUsingNLog\Test.cs:line 16
at ConsoleAppIndirectlyUsesNLog.Program.Main(String[] args) in C:\Test\CS4.x\ConsoleAppIndirectlyUsesNLog\Program.cs:line 11

但是,如果我将配置文件更改为输出到 OutputDebugString,则将 xsi:type 更改为“OutputDebugString”,如下所示:


<targets>
<target name="debugOutput" xsi:type="OutputDebugString" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="debugOutput" />
</rules>

然后一切都按预期工作,没有任何异常(exception)。我在调试输出窗口中得到了这个输出(在更改项目设置以支持非托管调试之后):
2012-09-28 12:16:13.4166|DEBUG|ClassLibraryUsingNLog.Test|Sample debug message
2012-09-28 12:16:13.4166|INFO|ClassLibraryUsingNLog.Test|Sample informational message
2012-09-28 12:16:13.4166|WARN|ClassLibraryUsingNLog.Test|Sample warning message
2012-09-28 12:16:13.4266|ERROR|ClassLibraryUsingNLog.Test|Sample error message
2012-09-28 12:16:13.4266|FATAL|ClassLibraryUsingNLog.Test|Sample fatal error message

有没有一种方法可以通过输出到 System.Diagnostics.Trace() 而不会引发 Logger.Error() 和 Logger.Fatal() 异常?为什么它会这样?

最佳答案

除了第一个答案:

当 LogLevel 为 >= LogLevel.Error 时,NLog TraceTarget 调用 Trace.Fail

Trace.Fail 方法记录在此处 http://msdn.microsoft.com/en-us/library/95s7fba5.aspx

问题的原因似乎是:

默认跟踪监听器的默认行为是在应用程序在用户界面模式下运行时将消息参数输出到消息框,并输出到 Listeners 集合中的 TraceListener 实例。

您可以在控制台应用程序中演示问题

 static void Main( string[ ] args ){
Trace.TraceInformation( "Hello world" );
Trace.Fail("A failure");
}

您可以通过在添加自己的 TraceListener 之前删除 DefaultTraceListener 来“修复”此问题
static void Main( string[ ] args ){
Trace.Listeners.Clear();
Trace.Listeners.Add( new ConsoleTraceListener( ) );
Trace.TraceInformation( "Hello world" );
Trace.Fail("A failure");
}

或者,您可以将 DefaultTraceListener 的 AssertUiEnabled 属性设置为 false。
static void Main( string[ ] args ){
Trace.Listeners.OfType<DefaultTraceListener>().First().AssertUiEnabled = false;
Trace.TraceInformation( "Hello world" );
Trace.Fail("A failure");
}

这会抑制断言失败对话框,但是跟踪输出仍然包含虚假的堆栈转储

如果您只想将日志信息发送到 Visual Studion 输出窗口,请使用 DebuggerTarget

关于c# - nlog:使用 "Trace"输出使 Logger.Error() 抛出异常 - 如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12639012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com