c# - NLog 异步目标数据库连接异常 - 如何获取它们?

标签 c# asynchronous azure-web-app-service nlog error-logging

任何人都可以帮助我解决 NLog 使用 AsyncTargetWrapper 登录数据库并且存在连接问题的情况吗?我如何获取/拦截这些异常(因为异步目标不会抛出异常)?这似乎是一个非常常见的场景,所以我很难相信 InternalLogger 是唯一的选择。这是一个示例项目(需要安装 NLog nuget 包):

using System;
using System.Threading;
using NLog;
using NLog.Common;
using NLog.Config;
using NLog.Targets;
using NLog.Targets.Wrappers;

class Program
{
    static void Main(string[] args)
    {
        LogManager.ThrowExceptions = true;
        InternalLogger.LogToConsole = true;
        InternalLogger.LogLevel = LogLevel.Error;

        var conf = new LoggingConfiguration();
        var target = new DatabaseTarget
        {
            ConnectionString =
                "Server=BAD_SERVER;Database=foo;",
            CommandText = "INSERT INTO logs(message) VALUES ('bar')"
        };

        var asyncTarget = new AsyncTargetWrapper(target);
        var rule = new LoggingRule("*", LogLevel.Trace, asyncTarget);
        conf.LoggingRules.Add(rule);

        LogManager.Configuration = conf;

        Logger logger = LogManager.GetLogger("Example");
        logger.Info("Message"); // doesn't throw an exception

        Thread.Sleep(16000);

        Console.WriteLine("\nDone");
        Console.ReadLine();
    }
}

因此应用无法连接到服务器(连接字符串中的服务器名称无效)。在达到某些默认值(隐藏在 NLog 的内部?)连接超时后,InternalLogger 将异常打印到控制台:

2016-01-20 16:39:36.8466 Error Error when writing to database System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

现在,我知道我可以设置 InternalLogger.LogFile() 但我必须在 Azure Web Apps 上托管的 Web 服务中使用它,并且当我尝试这样做时它不会创建任何文件(我必须使用相对路径,它在控制台应用程序中本地工作,但在部署到 Azure 之后就不行了)。

使用异步 NLog 记录器时如何处理连接异常?

最佳答案

您可以尝试:带有文件和数据库目标的回退包装器。

像这样:

<targets>
  <target xsi:type="FallbackGroup" name="target1" returnToFirstOnSuccess="true">
    <target xsi:type="Database" ... />
    <target xsi:type="File" ... />
  </target>

这也适用于 <targets async="true"> ,但我建议先在没有异步的情况下对其进行测试。

编辑: 这是一个已知问题,即使 ThrowExceptions =true 也不会抛出异常。 .我们正在努力解决这个问题,请参阅 GitHub .

目前,如果您无法登录到文件,您可以选择 another target ,比如 Memory 或 MethodCall 目标?

关于c# - NLog 异步目标数据库连接异常 - 如何获取它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34904454/

相关文章:

azure-web-app-service - 从命令行或 PowerShell 查看部署历史记录

azure-active-directory - "System Assigned"身份和应用注册的区别 "Service Principal"

c# - System.IO.Stream 有接口(interface)吗?

c# - ComboBox.SelectedValue 不工作

javascript - async.parallel 中的回调如何工作(它来自哪里?)

asynchronous - OSGi PushStream慢

c# - DataGridView CellFormatting 事件阻止表单绘制

c# - 使用 Linq 在两个日期之间重叠记录

javascript - $.getJSON 返回值到变量

azure - 无法使用已安装存储的 Linux 部署 Azure 应用服务的 ARM 模板