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

Cal*_*eb9 5 c# error-logging asynchronous nlog azure-web-sites

有人可以帮助我解决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();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,该应用无法连接到服务器(连接字符串中的服务器名称无效)。达到某些默认值(隐藏在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)
Run Code Online (Sandbox Code Playgroud)

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

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

Jul*_*ian 2

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

像这样的东西:

<targets>
  <target xsi:type="FallbackGroup" name="target1" returnToFirstOnSuccess="true">
    <target xsi:type="Database" ... />
    <target xsi:type="File" ... />
  </target>
Run Code Online (Sandbox Code Playgroud)

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

编辑:这是一个已知问题,即使ThrowExceptions =true. 我们正在努力解决这个问题,请参阅GitHub

目前,如果您在记录到文件时遇到问题,您可以选择另一个目标,例如 Memory 或 MethodCall 目标?