代码之家  ›  专栏  ›  技术社区  ›  Paul Milla

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

  •  1
  • Paul Milla  · 技术社区  · 8 年前

    我正在使用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库加载自定义类型,或者我只是做错了什么?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Paul Milla    8 年前

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

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