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" />