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

时间:2016-01-20 15:46:53

标签: c# asynchronous azure-web-sites 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' s guts?中)连接超时后,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服务中使用它,并且在我尝试时它不会创建任何文件(我必须使用相对path,在控制台应用程序中本地工作,但在部署到Azure后不能。

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

1 个答案:

答案 0 :(得分:2)

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

这样的事情:

<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目标吗?