【问题标题】:NLog async target database connection exceptions - how to get them?NLog 异步目标数据库连接异常 - 如何获取它们?
【发布时间】:2016-04-26 13:25:23
【问题描述】:

如果 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 记录器时如何处理连接异常?

【问题讨论】:

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


    【解决方案1】:

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

    类似这样的:

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

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

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

    目前,如果您在记录到文件时遇到问题,可以选择another target,比如 Memory 或 MethodCall 目标?

    【讨论】:

    • 谢谢。您的解决方案可以在本地工作,也可以使用异步。非常有用,但不幸的是它在部署到 Azure 后不起作用:(。我想我必须深入挖掘应用程序权限一定有问题。最终我宁愿只抛出异常,因为我可以通知客户出了点问题。但是,如果我只在 Azure 上创建该文件,您提出的解决方案就足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多