将Log4net与.NET Core 3.1结合使用


我想同时在

.NET Core应用程序和.NET Framework中使用log4net,但是我有些困惑。
我找不到任何类似的信息,因此请注意。

TL; DR

通过描述如下所示的程序集属性,即使在.NET Core 3.1中也可以轻松使用log4net

Program.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using log4net;

[assembly: log4net.Config.XmlConfigurator(ConfigFile="log4net.config",Watch=true)]

namespace console1
{
    class Program
    {
        static ILog logger = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {
            logger.Info("Hello World!");
        }
    }
}

log4net.config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <log4net>
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
            </layout>
        </appender>
        <root>
            <level value="ALL" />
            <appender-ref ref="ConsoleAppender" />
        </root>
    </log4net>
</configuration>

环境

  • .NET Core SDK 3.1.100
  • Visual Studio代码1.41.1

    • C#插件
  • log4net 2.0.8
  • Windows 10版本2004(操作系统内部版本1941.21)

长句子

没有日志输出。

我用

dotnet create console创建了一个项目,并用nuget导入了log4net,并尝试一次输出日志,但未输出。
生成的项目中没有AssemblyInfo.cs,并且未描述在.NET Framework中使用log4net时要写入的XmlConfigurator属性,因此似乎是原因。

查找解决方法。

我在网上搜索了一种解决方法。
在上一篇文章中,我找到了有关一种模式的信息,该模式用于自己使用XmlConfigurator设置Logger实例。
官方手册中也介绍了此方法。
它以这种方式工作,但是与log4net的通常可用性相比并不令人信服。

解决方法

Program.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using log4net;

namespace console1
{
    class Program
    {
        static ILog logger;

        static void Main(string[] args)
        {
            //log4net使う準備ここから
            XmlDocument log4netConfig = new XmlDocument();
            log4netConfig.Load(File.OpenRead(LOG_CONFIG_FILE));
            var repo = LogManager.CreateRepository(  
             Assembly.GetEntryAssembly(),
             typeof(log4net.Repository.Hierarchy.Hierarchy));
            log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);
            logger = LogManager.GetLogger(type);
            //log4net使う準備ここまで

            logger.Info("Hello World!");
        }
    }
}

参考

如何为.NET Core配置log4net

如何在ASP.NET Core应用程序中使用Log4Net

预期代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using log4net;

namespace console1
{
    class Program
    {
        static ILog logger = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {
            logger.Info("Hello World!");
        }
    }
}

首先,log4net如何在.NET Framework中工作?

从以上解决方法来看,似乎等效的处理已在某处完成。
我试图找出.NET Framework如何设置log4net。

<详细信息>

毕竟,我发现我正在从LogManager.GetLogger()进行调用,并查看了在给程序集的XmlConfiguratorAttribute中设置的文件。

  • LogManager.GetLogger(Type)-