Log4Net自定义渲染器配置错误

我有两个项目 . 一个是图书馆,一个是主持项目 .

在库中,我使用Log4Net将日志推送到一系列来源 . 我通过使用静态方法将log4net调用封装在公共帮助程序类中来控制日志记录 . 从宿主项目中,我调用库中定义的辅助方法 . (也许不是最好的架构,但需要继续并行支持旧的内部日志系统)

目前,主机应用程序是一个控制台应用程序 . 但是,该库将被其他Web应用程序和服务使用 .

Log4Net设置( Logger ,自定义appender和自定义渲染器)在主机的app.config文件中配置 . 在创建Log4Net Logger 类(Manager.GetLogger)之前的某个时刻,我使用XML.Configure()来加载设置,并成功创建了我定义的自定义appender . 一切都在这一点上起作用 .

我试图添加一个新的文件appender . 由于我们始终通过Log.Verbose(对象obj)而不是Log.Verbose(string msg)重载路由日志,因此我们必须创建自定义渲染器 . 目标是获取该对象并编写定义其内容的字符串 .

我使用了完全限定名称来配置自定义渲染器:

<log4net>
  <renderer renderingclass="Core.Logging.Log4NetObjectLogger, Jazz.Core35, Version=2.0.0.23, Culture=neutral, PublicKeyToken=etcetcetc" renderedclass="System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77aetcetcetcetc" />
<root>
<level value="ALL" />
<appender-ref ref="AzureLogAnalyticsAppender"/>
<appender-ref ref="FileAppender"/>
</root>

无论我做什么,我都无法摆脱这个错误:

log4net:ERROR Could not instantiate class [].
System.ArgumentException: String cannot have zero length.
at System.Reflection.RuntimeAssembly.GetType(RuntimeAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type)
at System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase)
at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase)
at log4net.Util.SystemInfo.GetTypeFromString(String typeName, Boolean throwOnError, Boolean ignoreCase)
at log4net.Util.OptionConverter.InstantiateByClassName(String className, Type superClass, Object defaultValue)
log4net:ERROR Could not instantiate renderer [].
log4net:ERROR Could not instantiate class [].
System.ArgumentException: String cannot have zero length.

我发现其他一些人抱怨同样的错误,但我找不到解决方法 . 为了获得完全限定的类型名称,我将typeof(actualType).AssemblyQualifiedName()写入控制台并粘贴结果 . 有人可以帮忙吗?

回答(1)

3 years ago

我通过camelCasing修复了这个xml属性,例如: renderingClass 代替 renderingclass .