【问题标题】:log4net cannot find my custom layout class in the class librarylog4net 在类库中找不到我的自定义布局类
【发布时间】:2023-03-20 13:34:01
【问题描述】:

我有一个控制台项目和一个类库。 log4net 安装在我的控制台项目和类库中。

我有一个这样的布局类用于测试目的。

public class CustomLayout : LayoutSkeleton
{
    public override void ActivateOptions() { }

    public override void Format(TextWriter writer, LoggingEvent loggingEvent)
    {
        writer.WriteLine(loggingEvent.MessageObject);
    }
}

当我在控制台项目中定义这个类时,它可以正常工作。但是当我在类库中定义这个类时,我得到一个错误。 log4net 没有看到这个类。

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>

程序.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

我试过了,但没用:&lt;layout type="ConsoleApp1.Core.CustomLayout, ConsoleApp1.Core" /&gt;

【问题讨论】:

    标签: c# log4net log4net-configuration


    【解决方案1】:

    由于您的 ConsoleApp1.Core.CustomLayout 类包含在单独的程序集中,
    您必须提供此布局类的完全限定名称。

    这包括它的命名空间、类名和程序集名称,这是您编译的库文件的名称,不带.dll 文件扩展名。

    例如,当您的类库文件名为MyClassLibrary.dll(并且您的问题中使用的命名空间和类名正确)时,您的布局类的注册必须如下所示:

    <layout type="ConsoleApp1.Core.CustomLayout, MyClassLibrary" />
    

    【讨论】:

    • 我以前试过这个: 但没用。在您回答后,我再次尝试并成功了。 :) 我以前不明白有什么不同。我想我错过了什么。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2020-12-14
    • 2022-07-03
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多