【问题标题】:Log4Net: How to specify FileAppender layout type from a library?Log4Net:如何从库中指定 FileAppender 布局类型?
【发布时间】:2016-12-16 17:50:24
【问题描述】:

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

之前我成功地使用了以下 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="MyConsoleApp.MyLogLayout">
      <conversionPattern value="%date{ISO8601}|%-5level|%message%newline" />
    </layout>
  </appender>

然后我尝试将 MyLogLayout 类移动到库项目“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 位于同一文件夹中,并且该引用按预期工作。奇怪的是,如果我创建一个类MyConsoleApp.MyLogLayoutChild,它只是从MyLibrary.MyLogLayout 继承所有内容并引用它,一切正常,但是将此代码推送到库中的主要目的是我不必创建一个新类对于我所做的每个项目,尤其是一个除了从父类继承所有内容之外没有任何逻辑的项目。

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

【问题讨论】:

  • 这里发生的是编译器认为您不需要该项目,因为它没有在代码中引用。这就是继承类使其工作的原因,因为现在有对该程序集的显式引用。
  • 嗯,看起来你是对的,尽管我在代码的其他部分引用了 MyLibrary,但我在 Program.cs 文件中没有这样做。谢谢!

标签: c# log4net log4net-appender


【解决方案1】:

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

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

【讨论】:

  • 完美!这是我正在寻找的最简单的解决方案。我想将它移动到库中的部分原因是我可以更轻松地在项目之间复制+粘贴我的 log4net 配置,而不必担心记住要实现代码。让其他人知道我什至不必包含版本、文化或 PublicKeyToken,只需添加我的库的命名空间就足够了。
  • 是的,但是一旦您决定签署您的库,您就必须指定版本和公钥。我不知道你的情况并发布了更常见的解决方案。
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多