Log4Net 2.0.8空引用异常问题排查求助
嘿,针对你遇到的log4net 2.0.8版本里EventLogAppender不断抛出空引用异常的问题,我来分享下排查和解决的思路:
首先,你定位到的异常触发代码段是EventLogAppender.cs中的这段逻辑:
if (eventTxt.Length > MAX_EVENTLOG_MESSAGE_SIZE) { eventTxt = eventTxt.Substring(0, MAX_EVENTLOG_MESSAGE_SIZE); }
这里抛出空引用,本质是**eventTxt实际为null**,但你通过动作断点看到的值是“149”,这几乎可以确定是Visual Studio的代码优化导致的调试显示异常。
为什么会出现这种“视觉欺骗”?
当你的项目开启了代码优化(发布模式默认开启,部分Debug模式也可能开启),JIT编译器会对代码做重排、变量复用等优化操作,这会导致调试器无法准确获取变量的实时值——你看到的“149”可能是eventTxt之前的旧值,而进入判断时它已经被置为null了。
怎么解决这个问题?
我给你几个可行的方案:
先确认变量真实状态
右键你的项目→属性→生成→取消勾选“优化代码”,重新编译后再调试。这时候调试器就能准确显示eventTxt的实时值,大概率会看到它确实是null。如果还是有问题,可以在这段代码前加一行System.Diagnostics.Debug.WriteLine(eventTxt);,通过输出窗口查看变量的真实内容——调试器的优化可能影响变量显示,但输出的是运行时的真实值。临时修复空引用问题
如果你能修改log4net的源码,给这段代码补上空值判断即可:if (!string.IsNullOrEmpty(eventTxt) && eventTxt.Length > MAX_EVENTLOG_MESSAGE_SIZE) { eventTxt = eventTxt.Substring(0, MAX_EVENTLOG_MESSAGE_SIZE); }编译后替换项目中引用的log4net.dll,就能避免空引用异常。
长久解决方案
升级log4net到2.0.15及以上的版本,这个空引用的问题在后续官方版本中已经被修复了,框架本身补上了空值校验的逻辑,不用再手动修改代码。
内容的提问来源于stack exchange,提问作者BiwiGreg

