zoukankan      html  css  js  c++  java
  • log4net在xp下不能写日志到mdb,报错Could not load type 'System.Security.Claims.ClaimsIdentity'

    使用log4net,在win7上可以正常使用,在xp电脑上可以生成access数据库,但是无法写数据到mdb文件,即mdb始终是空白的

    排除了程序原因,怀疑是xp缺少什么dll之类的

    偶然查到log4net的调试方法:

    第1步:

    (1)如果是配置在app.confing等confing文件中,在appSettings节点中增加名称为“log4net.Internal.Debug”的节点,并确保值为“true"

     <configuration>  
            <appSettings>  
                <add key="log4net.Internal.Debug" value="true"/>  
            </appSettings>  
      </configuration>  

    (2)如果配置在自定义的confing中,通过代码自定义调用,则直接在log4net节点增加debug="true"

    <configuration>    
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
      
      <log4net debug="true">
        <appender name="AllRollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
        ......
        </appender>
      </log4net>
    </configuration>

    第2步:在app.config文件<configuration>节点内增加如下节点

    <system.diagnostics>  
            <trace autoflush="true">  
                <listeners>  
                    <add   
                        name="textWriterTraceListener"   
                        type="System.Diagnostics.TextWriterTraceListener"   
                        initializeData="C:	mplog4net.txt" />  
                </listeners>  
            </trace>  
    </system.diagnostics>

    注意:文件夹 C: mp 必须存在,否则无法创建文件

    另外我在自定义并且加了watch的的config文件中加这段无效,不清楚是什么原因

     或者用代码添加

    System.Diagnostics.Trace.Listeners.Clear();
    System.Diagnostics.Trace.Listeners.Add(
       new System.Diagnostics.TextWriterTraceListener("C	mplog4net.txt"));

    加入了log4net的内部调试功能后,再运行程序调用log4net写日志时,会在C: mplog4net.txt文件中显示出如下错误信息:

    log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Failed in DoAppend
    System.TypeLoadException: Could not load type 'System.Security.Claims.ClaimsIdentity' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
    at log4net.Core.LoggingEvent.get_UserName()
    at log4net.Core.LoggingEvent.FixVolatileData(FixFlags flags)
    at log4net.Appender.BufferingAppenderSkeleton.Append(LoggingEvent loggingEvent)
    at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)

    简单的理解是找不到类System.Security.Claims.ClaimsIdentity,查了下msdn,这个类属于.net 4.5

    在网上搜了许久没找到解决方法,都大同小异,跟log4net官方说法类似 让别用xp,或者安装.net framework 4.5 

    但是现在国内很多地方为了节约成本等原因还是在用xp,而xp最高只能安装.net 4.0,显然无法解决

    我试过安装.net framework 4.0的补丁,KB2468871、KB2861188、KB2789642、KB2898855、KB2901110,结果无效

    试过360修复所有漏洞,按推荐的打了所有补丁,也不行

    通过网上的帖子了解到,问题引入的原因可能是,我使用了在.net 4.5的环境中生成的log4net.dll

    于是顺着这个思路,我最终也找到解决方案:

    在官网下载源码log4net-2.0.8-src.zip,解压后用vs2010打开log4net-2.0.8-srclog4net-2.0.8src下的log4net.vs2010.sln

    源码下有两个项目,直接生成解决方案会报错,发现是 log4net.Tests.vs2010下的nunit.framework引用丢失了

    直接在log4net.Tests.vs2010上右键,卸载项目,再重新生成就好了

    最后将log4net-2.0.8-srclog4net-2.0.8uildin et4.0debug目录下重新生成的dll引入到我们的工程就好了

    简单测试了一下可以使用,问题解决。附上文件log4net.dll (2.0.8   .net framework 4.0)

  • 相关阅读:
    ASP学习笔记
    Access restriction: The type 'BASE64Encoder'
    hdu2094:产生冠军(判断有环图)
    hdu1533:Going Home(KM匹配)
    hdu2112:HDU Today(最短路)
    hdu2112:HDU Today(最短路)
    hdu2813:One fihgt one(KM匹配)
    hdu2813:One fihgt one(KM匹配)
    hdu2236:无题II(枚举+匈牙利算法)
    hdu2236:无题II(枚举+匈牙利算法)
  • 原文地址:https://www.cnblogs.com/code1992/p/9342477.html
Copyright © 2011-2022 走看看