【发布时间】: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