代码之家  ›  专栏  ›  技术社区  ›  Mr Shoubs

如何在配置文件中注册自定义Log4Net对象呈现程序

  •  2
  • Mr Shoubs  · 技术社区  · 15 年前

    我正在尝试使用自定义渲染器在log4net中记录一个对象。我的配置文件有以下行:

      <renderer renderingClass="LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer" renderedClass="LogLibrary.TranferObjects.PdaLogObj" />
    

    但是在加载配置文件时,我得到一个TypeLoadException,log4net内部调试给出了以下详细信息:

    log4net:ERROR OptionConverter: Could not instantiate class [LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer].
    System.TypeLoadException: Could not load type [LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer]. Tried assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821] and all loaded assemblies
       at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase) in c:\work\svn_root\apache\log4net\tags\log4net-1.2.10-rc2\build\package\log4net-1.2.10\src\Util\SystemInfo.cs:line 671
       at log4net.Util.SystemInfo.GetTypeFromString(String typeName, Boolean throwOnError, Boolean ignoreCase) in c:\work\svn_root\apache\log4net\tags\log4net-1.2.10-rc2\build\package\log4net-1.2.10\src\Util\SystemInfo.cs:line 602
       at log4net.Util.OptionConverter.InstantiateByClassName(String className, Type superClass, Object defaultValue) in c:\work\svn_root\apache\log4net\tags\log4net-1.2.10-rc2\build\package\log4net-1.2.10\src\Util\OptionConverter.cs:line 477
    log4net:ERROR XmlHierarchyConfigurator: Could not instantiate renderer [LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer].
    

    对象和呈现程序的命名空间是正确的。

    有什么想法吗?

    编辑:这就是我在Global.asax中设置log4net的方式

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        // Fires when the application is started
    
        Dim logfile As String = "C:\Applications\LoggerWebService\Config\logConfig.xml"
        log4net.GlobalContext.Properties("Application") = My.Application.Info.ProductName
        log4net.GlobalContext.Properties("Version") = My.Application.Info.Version.ToString
    
        log4net.Config.XmlConfigurator.ConfigureAndWatch(New IO.FileInfo(logfile))
    
        Dim logger As log4net.ILog = log4net.LogManager.GetLogger(GetType(Global_asax))
        logger.Info("Started")
    
    End Sub
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    我无法想象这根本不起作用。尝试使用完全限定的类名。为此你需要 fully qualified assembly name .

    编辑: 对不起,我是说 类名 不是程序集名称。根据您的评论,我假设在您的案例中,完全限定的类名将使配置如下所示:

     <renderer renderingClass="LogLibrary.Log4NetObjRenderers.PdaLogObjRenderer, LogLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
               renderedClass="LogLibrary.TranferObjects.PdaLogObj, LogLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    
        2
  •  1
  •   Mr Shoubs    15 年前

    这是log4Net中的一个bug。如果你评论 <renderer 行,然后在web服务运行时取消注释它,它将工作。

    我能给出的唯一解释是,我不知道我的假设有多准确,但看起来并不是所有的程序集都被及时加载,以便log4Net获得渲染器。。。