为 .Net Core 3.1 应用程序配置 log4net 的最简单正确方法

Simplest correct way to configure log4net for a .Net Core 3.1 application

我正在努力理解配置 log4net 以在 .Net Core 3.1 应用程序中使用的最简单方法。该应用程序使用 log4net 2.0.8。所以:

有没有办法使用 application.runtimeconfig.json 文件来进行配置?如果是这样,我将向应用程序添加什么代码以告诉它使用这些设置 - 类似于:

log4net.Config.XmlConfigurator.Configure();

如果这不可能,那么添加配置文件(例如 log4net.xml 并告诉应用程序使用它)的最简单方法是什么?

我想暂时将所有日志记录定向到一个文件,比如说 Temp.log。我看过很多 log4net 页面,但他们要么谈论使用 Assembly.Info.cs,这在新的 .Net Core 3.1 项目中不存在,要么似乎以编程方式设置我想避免的 log4net 配置。我原以为这很容易,所以如果我错过了一个明显的方法,我深表歉意。

稍微编辑一下我的回答,以明确 Core 不包含开箱即用的普通文件记录器。我的错。 (截至 2020 年 5 月 19 日)

我建议使用 Microsoft 的日志记录扩展而不是 log4net,但这应该适合你。 Core 现在带有一个记录器,它非常好并且很容易插入 DI,并使用 appsettings.json。如果你愿意,我也可以提供一个样本。但这是 log4net 基本示例。

从文件(文件设置为始终复制)加载配置的示例控制台应用程序

using log4net.Repository;
using System;
using System.IO;
using System.Reflection;

namespace ConsoleApp1Core
{
    class Program
    {
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        static void Main(string[] args)
        {
            try
            {

                ILoggerRepository repository = log4net.LogManager.GetRepository(Assembly.GetCallingAssembly());

                var fileInfo = new FileInfo(@"log4net.config");

                log4net.Config.XmlConfigurator.Configure(repository, fileInfo);

                log.Info("test");

                Console.WriteLine("press any key");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine("Press any key to exit");
                Console.ReadLine();
            }
        }
    }
}

使用 Microsoft.Extensions.Logging。Log4Net.AspNetCore 很容易配置。

参考:https://github.com/huorswords/Microsoft.Extensions.Logging.Log4Net.AspNetCore

我可以通过以下方法回复:

1-Install-Package log4net
2-Install-Package MicroKnights.Log4NetAdoNetAppender
3-Install-Package System.Data.SqlClient

首先,我创建了一个数据库,Table 使用以下代码:

CREATE DATABSE Log4netDb
CREATE TABLE [dbo].[Log] (
    [Id] [int] IDENTITY (1, 1) NOT NULL,
    [Date] [datetime] NOT NULL,
    [Thread] [varchar] (255) NOT NULL,
    [Level] [varchar] (50) NOT NULL,
    [Logger] [varchar] (255) NOT NULL,
    [Message] [varchar] (4000) NOT NULL,
    [Exception] [varchar] (2000) NULL
)

其次, 我在程序中创建了 log4net.config 文件。 这是一个简单的配置,没有对日志消息进行自定义:

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
  <!-- definition of the RollingLogFileAppender goes here -->
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Logs/WebApp.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <!-- Format is [date/time] [log level] [thread] message-->
      <conversionPattern value="[%date] [%level] [%thread] %m%n" />
    </layout>
  </appender>
  <appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <bufferSize value="1" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />
    <connectionStringName value="log4net" />
    <connectionStringFile value="appsettings.json" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
    <parameter>
      <parameterName value="@log_date" />
      <dbType value="DateTime" />
      <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
      <parameterName value="@thread" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%thread" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@log_level" />
      <dbType value="String" />
      <size value="50" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@logger" />
      <dbType value="String" />
      <size value="255" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@message" />
      <dbType value="String" />
      <size value="4000" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message" />
      </layout>
    </parameter>
    <parameter>
      <parameterName value="@exception" />
      <dbType value="String" />
      <size value="2000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="RollingLogFileAppender" />
    <appender-ref ref="AdoNetAppender" />
  </root>
</log4net>

第三,我将下面的代码替换为 IHostBuilder :

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureLogging(logging =>
    {
        // clear default logging providers
        logging.ClearProviders();
        logging.AddConsole();  
        logging.AddDebug();
        logging.AddEventLog();
        // add more providers here
    })
    .UseStartup<Startup>();

第四,在appsettings.json我插入了这段代码:

{
  "connectionStrings": {
    "log4net": "Server=MICKO-PC;Database=Log4netDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

最后,我已经使用这些命令享受登录了

public class ValuesController : Controller
{
    private static readonly ILog log = LogManager.GetLogger(typeof(ValuesController));
    
    [HttpPost]
    public async Task<IActionResult> Login(string userName, string password)
    {
        log.Info("Action start");
        
        // More code here ...
        log.Info("Action end");
    }
    
    // More code here...
} 

祝你好运。

对我来说,唯一有用的是安装额外的 Nuget 包:

Serilog.Extensions.Logging.File

当然包括Microsoft.Extensions.Logging.Log4Net.AspNetCore