个推推送时,Log4net 无法将类型"System.RuntimeType"的对象强制转换为类型"log4net

时间:2021-09-01 13:31:57
关于 log4net 无法将类型"System.RuntimeType"的对象强制转换为类型"log4net.Util.ConverterInfo",这个问题困饶我好多天了,经过连日来的问题排查,终于被我发现问题所在,终结点在于版本问题.

初建项目时,我引入的是log4net1.2.10,后来因为项目中需要用到websocket,另一个同事又引入了一个log4net1.2.11,好了问题来了,这两个log4net用的又是不同的配置文件,两个版本的切换,要么是websocket可以启动,又写不了日志,要不就是可以写日志,websocket又启动不来,两个版本总是不能兼容.

最后定下心来,想想,高版本一定会兼容低版本的啦,就冷静下来,将项目中的log4net全部换成1.2.11,现在的问题是要分析这两个版本之间的log4net的升级区别了.非常偶然,在网上找到了一个与我所写的log4net配置不同的一项,见下面的代码
  1.    <!--日志分类描述-->
  2.    <parameter>
  3.     <parameterName value="@EventCategory"/>
  4.     <dbType value="String"/>
  5.     <size value="50"/>
  6.     <layout type="LogComponent.MyLayout, LogComponent">
  7.      <param name="ConversionPattern" value="%property{EventCategory}"/>
  8.     </layout>
  9.    </parameter>
复制代码
不同点在于 value="%property{EventCategory}"

原先我用的log4net1.10.0的写法是:
  1.       <parameter>
  2.         <parameterName value="@UserName" />
  3.         <dbType value="String" />
  4.         <size value="20" />
  5.         <layout type="YinJi.Common.CustomLayout">
  6.           <conversionPattern value="%username" />
  7.         </layout>
  8.       </parameter>
复制代码
作为具有多年工作经验的程序猿的本能,我感觉应该行了,试了试后,果不其然啊,真舒服,我成功解决了此问题

结论就是log4net1.10.0与log4net1.11.0的自定义属性写法不一样,新版本需要加入property属性