2016-01-20 27 views
4

任何人都可以幫我一個情況,其中NLog使用AsyncTargetWrapper登錄到數據庫,並且存在連接問題?我如何獲得/攔截這些異常(因爲異步目標不會拋出異常)?這似乎是一個很常見的情況,所以我很難相信InternalLogger是唯一的選擇。下面是一個例子項目(需要安裝NLOG NuGet包):NLog異步目標數據庫連接異常 - 如何獲取它們?

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(),但我有一個Web服務使用這個託管在Azure Web Apps上,並且在嘗試時不會創建任何文件(我必須使用相對路徑,該路徑在控制檯應用程序中本地運行,但在部署到Azure之後運行)。

如何使用異步NLog記錄器處理連接異常?

回答

1

您可以嘗試:帶文件和數據庫目標的備用包裝器。

事情是這樣的:

<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目標?

+0

謝謝。您的解決方案可以在本地使用,也可以使用異步。非常有用,但不幸的是它在部署到Azure後無法工作:(。我想應該有一些應用程序權限問題,我必須深入挖掘。最終,我寧願拋出異常,因爲我可以通知客戶端如果我只是在Azure上創建該文件,那麼您提出的解決方案就足夠了。 – Caleb9