我正在尝试记录来自IKVM.OpenJDK.Jdbc程序集的异常。其中一个发生的异常是
java.sql.SQLException
(和子类)。log4Net似乎会因为java.sql.SQLException
实现了IEnumerable
而出现问题,而其实现只返回它本身。我已经逐步检查了这个的log4net代码,看起来像是log4net说:
"这里有一个需要记录的SQLException。它包含任何应该记录的信息吗?哦,是的,它有。有一个IEnumerable,我最好记录IEnumerable内部的内容。那么在IEnumerable里面有什么?噢,它是一个需要记录的SQLException。它包含任何需要记录的信息吗?哦,是的,它有。有一个IEnumerable,我最好记录IEnumerable内部的内容。那么在IEnumerable里面有什么?噢,它是一个SQLException..."
最终我们得到了一个StackOverflowException
。
之前有人遇到并解决过这个问题吗?
最小可验证完整示例:
static void Main(string[] args)
{
java.sql.SQLException ex = new java.sql.SQLException();
log4net.Config.BasicConfigurator.Configure();
log4net.ILog logger = log4net.LogManager.GetLogger("foo");
logger.Error("This exception overflows the stack -> ", ex); // Exception here
Console.WriteLine("Finished. Press any key...");
Console.ReadKey();
}
我使用的packages.config可获取正确的NuGet进行编译(NuGet来源= https://www.nuget.org/api/v2/):
<packages>
<package id="log4net" version="2.0.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.Jdbc" version="7.2.4630.5" targetFramework="net452" />
<!-- The packages below are dependencies from manually getting the packages above. -->
<package id="IKVM.OpenJDK.Charsets" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.Core" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.Misc" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.Naming" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.Remoting" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.Security" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.SwingAWT" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.Text" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.Util" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.OpenJDK.XML.API" version="7.2.4630.5" targetFramework="net452" />
<package id="IKVM.Runtime" version="7.2.4630.5" targetFramework="net452" />
</packages>