2016-03-21 118 views
0

我已經配置NLOG記錄錯誤/日誌兩個MySQL /數據庫目標:NLOG - StackOverflow的例外/ NLog.NLogRuntimeException與MySQL數據庫的目標發生

<nlog autoReload="false" internalLogFile="omg.txt" throwExceptions="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <!--<nlog autoReload="false" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">--> 
    <variable name="DefaultLayout" value="${longdate} | ${uppercase:${level}} | ${logger} | ${message}&#xD;&#xA;  ${exception:innerFormat=ToString:maxInnerExceptionLevel=6:innerExceptionSeparator=InnerException:format=ToString}" /> 
    <targets> 
    <target xsi:type="ColoredConsole" name="console" layout="${DefaultLayout}" /> 
    <target xsi:type="Null" name="nulltarget" formatMessage="false" layout="${DefaultLayout}" /> 
    <target xsi:type="Database" 
      name="MySqlErrorTarget" 
      dbProvider="MySql.Data.MySqlClient" connectionString="x" 
      keepConnection="true"> 
     <commandText> 
     CALL Error_Insert(@Message) 
     </commandText> 
     <parameter name="@Message" layout="${message}" /> 
     (...) 
    </target> 
    <target xsi:type="Database" 
      name="MySqlLogTarget" 
      dbProvider="MySql.Data.MySqlClient" connectionString="x" 
      keepConnection="true"> 
     <commandText> 
     CALL Log_Insert(@Message) 
     </commandText> 
     <parameter name="@Message" layout="${message}" /> 
     (...) 
    </target> 
    </targets> 
    <rules> 
    <logger name="*" levels="TRACE, DEBUG, INFO" writeTo="MySqlLogTarget"/> 
    <logger name="*" levels="WARN, ERROR, FATAL" writeTo="MySqlErrorTarget"/> 
    <logger name="*" minlevel="INFO" writeTo="console" /> 
    </rules> 
</nlog> 

當MySQL數據庫可一切都很正常,但是當MySQL關閉時,NLog引發StackOverflow異常。內部日誌文件如下所示:

2016-03-21 15:36:33.0487 Error Error when writing to database MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts. ---> System.Net.Sockets.SocketException (0x80004005): No such host is known 
    at System.Net.Dns.GetAddrInfo(String name) 
    at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6) 
    at System.Net.Dns.GetHostEntry(String hostNameOrAddress) 
    at MySql.Data.Common.MyNetworkStream.CreateStream(MySqlConnectionStringBuilder settings, Boolean unix) 
    at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings) 
    at MySql.Data.MySqlClient.NativeDriver.Open() 
    at MySql.Data.MySqlClient.NativeDriver.Open() 
    at MySql.Data.MySqlClient.Driver.Open() 
    at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) 
    at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() 
    at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() 
    at MySql.Data.MySqlClient.MySqlPool.GetConnection() 
    at MySql.Data.MySqlClient.MySqlConnection.Open() 
    at NLog.Targets.DatabaseTarget.OpenConnection(String connectionString) 
    at NLog.Targets.DatabaseTarget.EnsureConnectionOpen(String connectionString) 
    at NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo logEvent) 
    at NLog.Targets.DatabaseTarget.Write(LogEventInfo logEvent) 
2016-03-21 15:37:00.1794 Error Error when writing to database MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts. ---> System.Net.Sockets.SocketException (0x80004005): No such host is known 
    at System.Net.Dns.GetAddrInfo(String name) 
    at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6) 
    at System.Net.Dns.GetHostEntry(String hostNameOrAddress) 
    at MySql.Data.Common.MyNetworkStream.CreateStream(MySqlConnectionStringBuilder settings, Boolean unix) 
    at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings) 
    at MySql.Data.MySqlClient.NativeDriver.Open() 
    at MySql.Data.MySqlClient.NativeDriver.Open() 
    at MySql.Data.MySqlClient.Driver.Open() 
    at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) 
    at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() 
    at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() 
    at MySql.Data.MySqlClient.MySqlPool.GetConnection() 
    at MySql.Data.MySqlClient.MySqlConnection.Open() 
    at NLog.Targets.DatabaseTarget.OpenConnection(String connectionString) 
    at NLog.Targets.DatabaseTarget.EnsureConnectionOpen(String connectionString) 
    at NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo logEvent) 
    at NLog.Targets.DatabaseTarget.Write(LogEventInfo logEvent) 

這是無限的,因此最終發生StackOverflow。異常在Visual Studio報告看起來就像如下:

NLog.NLogRuntimeException occurred 
    HResult=-2146233088 
    Message=Exception occurred in NLog 
    Source=NLog 
    StackTrace: 
     at NLog.LoggerImpl.<>c__DisplayClass1.<Write>b__0(Exception ex) 
     at NLog.Internal.SingleCallContinuation.Function(Exception exception) 
     at NLog.Targets.Target.Write(AsyncLogEventInfo logEvent) 
     at NLog.Targets.Target.WriteAsyncLogEvent(AsyncLogEventInfo logEvent) 
     at NLog.LoggerImpl.WriteToTargetWithFilterChain(TargetWithFilterChain targetListHead, LogEventInfo logEvent, AsyncContinuation onException) 
     at NLog.LoggerImpl.Write(Type loggerType, TargetWithFilterChain targets, LogEventInfo logEvent, LogFactory factory) 
     at NLog.Logger.Debug(String message) 
     at Runner.Main(String[] args) in C:\Repos\x\src\Runner.cs:line 36 
    InnerException: 
     ErrorCode=-2147467259 
     HResult=-2147467259 
     Message=Unable to connect to any of the specified MySQL hosts. 
     Number=1042 
     Source=MySql.Data 
     StackTrace: 
      at MySql.Data.MySqlClient.NativeDriver.Open() 
      at MySql.Data.MySqlClient.Driver.Open() 
      at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) 
      at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() 
      at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() 
      at MySql.Data.MySqlClient.MySqlPool.GetConnection() 
      at MySql.Data.MySqlClient.MySqlConnection.Open() 
      at NLog.Targets.DatabaseTarget.OpenConnection(String connectionString) 
      at NLog.Targets.DatabaseTarget.EnsureConnectionOpen(String connectionString) 
      at NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo logEvent) 
      at NLog.Targets.DatabaseTarget.Write(LogEventInfo logEvent) 
      at NLog.Targets.Target.Write(AsyncLogEventInfo logEvent) 
     InnerException: 
      ErrorCode=11001 
      HResult=-2147467259 
      Message=No such host is known 
      NativeErrorCode=11001 
      Source=System 
      StackTrace: 
       at System.Net.Dns.GetAddrInfo(String name) 
       at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6) 
       at System.Net.Dns.GetHostEntry(String hostNameOrAddress) 
       at MySql.Data.Common.MyNetworkStream.CreateStream(MySqlConnectionStringBuilder settings, Boolean unix) 
       at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings) 
       at MySql.Data.MySqlClient.NativeDriver.Open() 
      InnerException: 

我試圖改變規則:

<rules> 
    <logger name="NLog.*" minlevel="TRACE" writeTo="nulltarget" final="true"/> 
    <logger name="MySql.*" minlevel="TRACE" writeTo="nulltarget" final="true"/> 
    <logger name="System.*" minlevel="TRACE" writeTo="nulltarget" final="true"/> 
    <logger name="*" levels="TRACE, DEBUG, INFO" writeTo="MySqlLogTarget"/> 
    <logger name="*" levels="WARN, ERROR, FATAL" writeTo="MySqlErrorTarget"/> 
    <logger name="*" minlevel="INFO" writeTo="console" /> 
    </rules> 

但是,它並不能幫助。任何想法如何避免StackOverflowException?

回答

0

原來那地方在我的代碼基礎是這一行調用:

Trace.Listeners.Add(new NLogTraceListener()); 

造成從MySQL的錯誤日誌被重定向到跟蹤,並感謝NLogTraceListener,它是由NLOG使用MySQL的目標登錄,失敗並被重定向到Trace,並且感謝NLogTraceListener,它由NLog使用MySql目標記錄,這......你知道這是怎麼回事。

我沒有想出一個很好的解決方案,因爲沒有足夠的信息來過濾TraceListener中的日誌(只是將消息作爲字符串)。因此,我暫時關閉了NLogTraceListener,因爲啓用它並不重要。

+0

您可以使用loggername('$ {logger}')/ callsite('$ {callsite}') – Julian

0

設置throwExceptions<nlogfalse。連接異常將被NLog忽略,NLog不會嘗試將其記錄到數據庫。

+0

然後發生StackOverflow。我會嘗試隔離問題並創建一個簡單的控制檯應用程序。 – piotrwest