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。

编辑:

  1. 我使用的是最新的NLog版本(v4.0)
  2. 我还确认LogManager.ThrowException在运行时

NLog没有';t抛出异常

DatabaseTargetWrite方法封装在try/catch中,该try/catch只会重新抛出特定类型的异常(StackOverflowThreadAbortOutOfMemoryNLogConfiguration)。正如您所注意到的,其他异常将只写入内部日志。

如果可以选择的话,那么实现一个自定义目标并覆盖这个方法是相当琐碎的。

 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();
        }
    }
}