C# NLog-MySQL数据库目标发生StackOverflow异常/NLog.NLogRuntimeException
我已将NLog配置为将错误/日志记录到两个MySQL/数据库目标:C# NLog-MySQL数据库目标发生StackOverflow异常/NLog.NLogRuntimeException,c#,mysql,.net,logging,nlog,C#,Mysql,.net,Logging,Nlog,我已将NLog配置为将错误/日志记录到两个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
<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}
 ${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>
这是无限的,因此最终会发生堆栈溢出。Visual Studio中报告的异常如下所示:
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)
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:
NLog.NLogRuntimeException发生
HResult=-2146233088
消息=NLog中发生异常
震源=NLog
堆栈跟踪:
在NLog.LoggerImpl.c__;u DisplayClass1.b__0处(异常示例)
位于NLog.Internal.SingleCallContinuation.Function(异常)
在NLog.Targets.Target.Write处(AsyncLogEventInfo logEvent)
位于NLog.Targets.Target.WriteAsynClogeEvent(AsyncLogEventInfo logEvent)
在NLog.LoggerImpl.WriteToTargetWithFilterChain(TargetWithFilterChain targetListHead、LogEventInfo logEvent、AsyncContinuation OneException)处
在NLog.LoggerImpl.Write处(输入loggerType、TargetWithFilterChain targets、LogEventInfo、logEvent、LogFactory)
在NLog.Logger.Debug处(字符串消息)
在C:\Repos\x\src\Runner.cs中的Runner.Main(字符串[]args)处:第36行
内部异常:
错误代码=-2147467259
HResult=-2147467259
Message=无法连接到任何指定的MySQL主机。
数字=1042
Source=MySql.Data
堆栈跟踪:
在MySql.Data.MySqlClient.NativeDriver.Open()上
在MySql.Data.MySqlClient.Driver.Open()上
位于MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder设置)
在MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()上
在MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()上
在MySql.Data.MySqlClient.MySqlPool.GetConnection()上
在MySql.Data.MySqlClient.MySqlConnection.Open()上
位于NLog.Targets.DatabaseTarget.OpenConnection(字符串连接字符串)
在NLog.Targets.DatabaseTarget.EnsureReconnectionOpen处(字符串连接字符串)
在NLog.Targets.DatabaseTarget.WriteEventToDatabase(LogEventInfo logEvent)中
在NLog.Targets.DatabaseTarget.Write处(LogEventInfo logEvent)
在NLog.Targets.Target.Write处(AsyncLogEventInfo logEvent)
内部异常:
错误代码=11001
HResult=-2147467259
Message=不知道这样的主机
NativeErrorCode=11001
来源=系统
堆栈跟踪:
位于System.Net.Dns.GetAddrInfo(字符串名称)
位于System.Net.Dns.InternalGetHostByName(字符串主机名,布尔值includeIPv6)
位于System.Net.Dns.GetHostEntry(字符串HostName或Address)
位于MySql.Data.Common.MyNetworkStream.CreateStream(MySqlConnectionStringBuilder设置,布尔unix)
位于MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder设置)
在MySql.Data.MySqlClient.NativeDriver.Open()上
内部异常:
我尝试将规则更改为:
<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吗?在
上设置throweExceptions
,结果是在我的代码库中的某个地方调用了这一行:
Trace.Listeners.Add(new NLogTraceListener());
这导致来自MySql的错误日志被重定向到跟踪,多亏了NLogTraceListener,它由NLog使用MySql目标记录,但失败并被重定向到跟踪,多亏了NLogTraceListener,它由NLog使用MySql目标记录,这。。。你知道这是怎么回事
我没有想出一个好的解决方案,因为没有足够的信息来过滤TraceListener中的日志(只是作为字符串的消息)。因此,我暂时关闭了NLogTraceListener,因为打开它并不重要。然后会发生堆栈溢出。我将尝试隔离此问题并创建一个简单的控制台应用程序。您可以使用loggername(${logger}
)/callsite(${callsite}
)过滤这些问题