log4net 在 class 库中找不到我的自定义布局 class
log4net cannot find my custom layout class in the class library
我有一个控制台项目和一个 class 库。
log4net 安装在我的控制台项目和我的 class 库中。
我有这样的布局 class 用于测试目的。
public class CustomLayout : LayoutSkeleton
{
public override void ActivateOptions() { }
public override void Format(TextWriter writer, LoggingEvent loggingEvent)
{
writer.WriteLine(loggingEvent.MessageObject);
}
}
当我在我的控制台项目中定义它时,这个 class 工作正常。但是当我在 class 库中定义这个 class 时,我得到一个错误。 log4net 看不到这个 class.
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log-file.txt" />
<!-- error -->
<layout type="ConsoleApp1.Core.CustomLayout" />
<!-- working properly-->
<!--<layout type="ConsoleApp1.CustomLayout" />-->
</appender>
<logger name="FileLogger">
<level value="ALL" />
<appender-ref ref="FileAppender" />
</logger>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>
Program.cs
class Program
{
private static readonly ILog Log = LogManager.GetLogger("FileLogger");
static void Main(string[] args)
{
Log.Error("This is my error log.");
Console.ReadLine();
}
}
我将此添加到 AssemblyInfo.cs:[assembly: log4net.Config.XmlConfigurator(Watch = true)]
我得到的错误如下:
log4net:ERROR Failed to find type [ConsoleApp1.Core.CustomLayout]
System.TypeLoadException: Could not load type [ConsoleApp1.Core.CustomLayout]. Tried assembly [log4net, Version=2.0.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a] and all loaded assemblies
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.Repository.Hierarchy.XmlHierarchyConfigurator.CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint)
log4net:ERROR Failed to create object to set param: layout
我试过了,但没用:<layout type="ConsoleApp1.Core.CustomLayout, ConsoleApp1.Core" />
由于您的 ConsoleApp1.Core.CustomLayout
class 包含在单独的程序集中,
您必须提供此布局的完全限定名称 class。
这包括它的命名空间、class 名称和程序集名称,即不带 .dll
文件扩展名的已编译库文件的名称。
例如,当您的 class 库文件被称为 MyClassLibrary.dll
(并且您的问题中使用的命名空间和 class 名称是正确的),布局的注册 class 必须看起来像:
<layout type="ConsoleApp1.Core.CustomLayout, MyClassLibrary" />
我有一个控制台项目和一个 class 库。 log4net 安装在我的控制台项目和我的 class 库中。
我有这样的布局 class 用于测试目的。
public class CustomLayout : LayoutSkeleton
{
public override void ActivateOptions() { }
public override void Format(TextWriter writer, LoggingEvent loggingEvent)
{
writer.WriteLine(loggingEvent.MessageObject);
}
}
当我在我的控制台项目中定义它时,这个 class 工作正常。但是当我在 class 库中定义这个 class 时,我得到一个错误。 log4net 看不到这个 class.
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log-file.txt" />
<!-- error -->
<layout type="ConsoleApp1.Core.CustomLayout" />
<!-- working properly-->
<!--<layout type="ConsoleApp1.CustomLayout" />-->
</appender>
<logger name="FileLogger">
<level value="ALL" />
<appender-ref ref="FileAppender" />
</logger>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>
Program.cs
class Program
{
private static readonly ILog Log = LogManager.GetLogger("FileLogger");
static void Main(string[] args)
{
Log.Error("This is my error log.");
Console.ReadLine();
}
}
我将此添加到 AssemblyInfo.cs:[assembly: log4net.Config.XmlConfigurator(Watch = true)]
我得到的错误如下:
log4net:ERROR Failed to find type [ConsoleApp1.Core.CustomLayout]
System.TypeLoadException: Could not load type [ConsoleApp1.Core.CustomLayout]. Tried assembly [log4net, Version=2.0.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a] and all loaded assemblies
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.Repository.Hierarchy.XmlHierarchyConfigurator.CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint)
log4net:ERROR Failed to create object to set param: layout
我试过了,但没用:<layout type="ConsoleApp1.Core.CustomLayout, ConsoleApp1.Core" />
由于您的 ConsoleApp1.Core.CustomLayout
class 包含在单独的程序集中,
您必须提供此布局的完全限定名称 class。
这包括它的命名空间、class 名称和程序集名称,即不带 .dll
文件扩展名的已编译库文件的名称。
例如,当您的 class 库文件被称为 MyClassLibrary.dll
(并且您的问题中使用的命名空间和 class 名称是正确的),布局的注册 class 必须看起来像:
<layout type="ConsoleApp1.Core.CustomLayout, MyClassLibrary" />