Log4Net:如何从库中指定 FileAppender 布局类型?

Log4Net: How to specify FileAppender layout type from a library?

我在我的控制台应用程序中使用 Log4Net 的 RollingLogFileAppender 和自定义布局 class 来打印 header 中的一些元数据信息。我现在想将这个自定义布局 class 打包到一个库中并告诉 log4net 使用它。

以前我能够成功使用以下附加程序配置:

  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <threshold value="DEBUG />
    <file value="C:\Logs\MyConsoleApp.log"
          type="log4net.Util.PatternString" />
    <preserveLogFileNameExtension value="true" />
    <datePattern value="_yyyyMMdd" />
    <rollingStyle value="Date" />
    <appendToFile value="true" />
    <staticLogFileName value="false" />
    <layout type="MyConsoleApp.MyLogLayout">
      <conversionPattern value="%date{ISO8601}|%-5level|%message%newline" />
    </layout>
  </appender>

然后我尝试将 MyLogLayout class 移动到库项目 "MyLibrary.MyLogLayout",将其导入 MyConsoleApp,并尝试更新我的 appender 代码如下:

  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <threshold value="DEBUG />
    <file value="C:\Logs\MyConsoleApp.log"
          type="log4net.Util.PatternString" />
    <preserveLogFileNameExtension value="true" />
    <datePattern value="_yyyyMMdd" />
    <rollingStyle value="Date" />
    <appendToFile value="true" />
    <staticLogFileName value="false" />
    <layout type="MyLibrary.MyLogLayout">
      <conversionPattern value="%date{ISO8601}|%-5level|%message%newline" />
    </layout>
  </appender>

尝试 运行 时出现此错误:

log4net:ERROR Failed to find type [MyLibrary.MyLogLayout]
System.TypeLoadException: Could not load type [MyLibrary.MyLogLayout]. Tried assembly [log4net, Version=1.2.15.0, Culture=neutral
, PublicKeyToken=669e0ddf0bb1aa2a] and all loaded assemblies
   at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, Strin
g typeName, Boolean throwOnError, Boolean ignoreCase)
   at log4net.Util.SystemInfo.GetTypeFromString(String typeName, Boolean throwOn
Error, Boolean ignoreCase)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.CreateObjectFromXml(
XmlElement element, Type defaultTargetType, Type typeConstraint)
log4net:ERROR Failed to create object to set param: layout

我已经仔细检查以确保 dll 位于同一文件夹中,并且引用按预期工作。奇怪的是,如果我创建一个 class MyConsoleApp.MyLogLayoutChild 来继承 MyLibrary.MyLogLayout 的所有内容并引用它一切正常,但是将此代码推送到库中的主要目的是让我不不必为我所做的每个项目创建一个新的 class,尤其是那些除了从 parent class.[=15 继承所有内容之外没有任何逻辑的项目=]

log4net 是否支持从 dll 库加载自定义类型,还是我做错了什么?

它不起作用,因为 TypeLoader 不知道在哪里可以找到您的 class。您需要通过指定类型的完全限定名称来帮助它。 喜欢

<layout type="MyLibrary.MyLogLayout, MyLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">