NLog没有';t抛出异常
本文关键字:抛出异常 没有 NLog | 更新日期: 2023-09-27 18:21:18
每当数据库目标出现连接故障时,我希望NLog抛出异常并传递给我的应用程序。
这是我的NLog配置文件:
<nlog autoReload="true"
throwExceptions="true"
internalLogLevel="Debug" internalLogFile="c:'temp'nlog-internal.log">
现在,当配置文件中出现错误时,它确实会在配置时抛出运行时异常。此外,它会在内部日志文件中记录有关连接失败的异常,但不会将异常抛出给调用应用程序。
我还尝试将Logger.Log方法封装在try-catch
中,只是为了确保它不会吞噬它,但Logger.Log语句已成功执行。
它还有什么可以在应用程序中捕获异常的功能吗。我只想准备一个未记录的日志事件的缓存,然后在连接再次可用时登录回SQL Server。
编辑:
- 我使用的是最新的NLog版本(v4.0)
- 我还确认
LogManager.ThrowException
在运行时
DatabaseTarget
的Write
方法封装在try/catch中,该try/catch只会重新抛出特定类型的异常(StackOverflow
、ThreadAbort
、OutOfMemory
和NLogConfiguration
)。正如您所注意到的,其他异常将只写入内部日志。
如果可以选择的话,那么实现一个自定义目标并覆盖这个方法是相当琐碎的。
protected override void Write(AsyncLogEventInfo[] logEvents)
{
var buckets = SortHelpers.BucketSort(logEvents, c => this.BuildConnectionString(c.LogEvent));
try
{
foreach (var kvp in buckets)
{
foreach (AsyncLogEventInfo ev in kvp.Value)
{
try
{
this.WriteEventToDatabase(ev.LogEvent);
ev.Continuation(null);
}
catch (Exception exception)
{
if (exception.MustBeRethrown())
{
throw;
}
// in case of exception, close the connection and report it
InternalLogger.Error("Error when writing to database {0}", exception);
this.CloseConnection();
ev.Continuation(exception);
}
}
}
}
finally
{
if (!this.KeepConnection)
{
this.CloseConnection();
}
}
}