如何在配置文件中注册自定义 Log4Net 对象渲染器

发布于 2024-10-01 13:57:28 字数 2158 浏览 0 评论 0 原文

我正在尝试使用自定义渲染器在 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

I'm trying to log an object in log4net using a custom renderer. My configuration file has the following line:

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

But I get a TypeLoadException when loading the configuration file, and log4net internal debugging gives this detail:

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].

The Namespace of the object and the renderers are correct.

Any ideas?

EDIT: This is how I am setting log4net up in Global.asax

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

脸赞 2024-10-08 13:57:28

我无法想象这根本不起作用。尝试使用完全限定的类名。为此,您需要完全限定的程序集名称< /a>.

编辑:
抱歉,我的意思是类名而不是程序集名称。根据您的评论,我假设您的情况下的完全限定类名将使配置如下所示:

 <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" />

I cannot imagine that this is not working at all. Try to use the fully qualified class name. For this you need the fully qualified assembly name.

EDIT:
Sorry, I meant class name not assembly name. Based on your comment I assume the fully qualified class name in your case would make the configuration look like this:

 <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" />
孤者何惧 2024-10-08 13:57:28

这是 log4Net 中的一个错误。如果您注释掉 行,然后在 Web 服务运行时取消注释,它将起作用。

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

This is a bug in log4Net. If you comment out the <renderer line and then uncomment it whilst the web service is running, it will work.

The only explanation I can give, and I don't know how accurate my assumption is, but it looks as though not all the assemblies are loaded in time for log4Net to get the renderer...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文