2016-03-21 22 views
0

MySQLデータベースのターゲットで発生しましたMySQLがダウンすると、NLogはStackOverflow例外をスローします。内部ログファイルは次のようになります。NLog StackOverflowの例外/ NLog.NLogRuntimeExceptionは、私は2つのMySQL /データベースのターゲットに/ NLogはエラーをログに記録するログを設定した

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が発生します。

<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> 

しかし、それは解決しない:私は、ルールを変更しようとした

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: 

次のようにVisual Studioの中で報告された例外が見えます。任意のアイデアはどのように私はStackOverflowExceptionを避けることができますか?

答えて

0

どこかに私のコードベースでは、この行が呼び出されたことが判明:

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

MySQLからのエラー・ログがトレースにリダイレクトされた、とNLogTraceListenerのおかげでは、それはMySQLのターゲットを使用してNLogによって記録されたことが原因となりましたこれは失敗し、Traceにリダイレクトされ、NLogTraceListenerのおかげで、MyLogターゲットを使用してNLogによって記録されました。

TraceListener(文字列としてのメッセージ)のログをフィルタリングするのに十分な情報がないため、いい解決法はありませんでした。したがって、NLogTraceListenerを一時的に無効にしています。これは、不可欠ではありません。

+0

loggername( '$ {logger}')/ callsite( '$ {callsite}')を使ってフィルタリングすることができます – Julian

0

~にthrowExceptionsを設定します。接続例外はNLogによって無視され、NLogはデータベースにログオンしようとしません。

+0

その後、StackOverflowが発生します。問題を特定し、簡単なコンソールアプリケーションを作成しようとします。 – piotrwest

関連する問題