Log4Net 自定义渲染器配置错误

Log4Net Custom Renderer Configuration Error

我有两个项目。一个是库,一个是宿主项目。

在图书馆,我使用 Log4Net 将日志推送到一系列来源。我通过使用静态日志记录方法将 log4net 调用封装在 public 帮助程序 class 中来控制日志记录。在宿主项目中,我调用了库中定义的辅助方法。 (可能不是最好的架构,但需要继续并行支持旧的内部日志系统

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

Log4Net 设置(记录器、自定义附加程序和自定义渲染器)在主机的 app.config 文件中配置。在创建 Log4Net 记录器 class (Manager.GetLogger) 之前的某个时刻,我使用 XML.Configure() 加载设置,并且我定义的自定义附加程序已成功创建。此时一切正常。

我尝试添加一个新的文件追加器。由于我们总是通过 Log.Verbose(object 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() 写入控制台并粘贴结果。有人可以帮忙吗?

我通过 xml 属性的 camel Casing 修复了这个问题,例如renderingClass 而不是 renderingclass.