简体   繁体   English

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

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

I am struggling with understanding the simplest way to configure log4net to use in a .Net Core 3.1 application.我正在努力理解配置 log4net 以在 .Net Core 3.1 应用程序中使用的最简单方法。 The application is using log4net 2.0.8.该应用程序使用的是 log4net 2.0.8。 So:所以:

Is there a way to use the application.runtimeconfig.json file to configure to do this?有没有办法使用 application.runtimeconfig.json 文件来配置来做到这一点? If so, what code would I add to the application to tell it to use these settings - something like:如果是这样,我会向应用程序添加什么代码来告诉它使用这些设置 - 例如:

log4net.Config.XmlConfigurator.Configure();

If this is not possible, then what's the simplest way to add a configuration file, say log4net.xml, and tell the application to use this?如果这是不可能的,那么添加配置文件(比如 log4net.xml)并告诉应用程序使用它的最简单方法是什么?

I want to direct all of the logging to a file for the moment, say Temp.log.我想暂时将所有日志记录定向到一个文件,比如 Temp.log。 I've looked at many log4net pages, but they either talk about using Assembly.Info.cs which does not exist in new .Net Core 3.1 projects, or seem to programmatically set the log4net configuration which I'd like to avoid.我看过很多 log4net 页面,但他们要么谈论使用在新的 .Net Core 3.1 项目中不存在的 Assembly.Info.cs,要么似乎以编程方式设置了我想避免的 log4net 配置。 I was expecting this to be easy, so apologies if I have missed an obvious approach.我原以为这很容易,所以如果我错过了一个明显的方法,我深表歉意。

Editing my answer a little to be clear that Core does NOT include a normal file logger out of the box.稍微编辑我的答案以明确 Core 不包含开箱即用的普通文件记录器。 My bad.我的错。 (as of 5/19/2020) (截至 2020 年 5 月 19 日)

I would recommend using the logging extensions from Microsoft instead of log4net, but this should do for you.我建议使用 Microsoft 的日志扩展而不是 log4net,但这应该对您有用。 Core now comes with a logger and it's pretty nice and plugs in easy for DI, and uses appsettings.json. Core 现在带有一个记录器,它非常好,易于 DI 插入,并使用 appsettings.json。 I can provide a sample of that too if you want.如果你愿意,我也可以提供一个样本。 But here's log4net basic example.但这里是 log4net 基本示例。

Sample console app that loads config from a file (file set to Copy Always)从文件加载配置的示例控制台应用程序(文件设置为始终复制)

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();
            }
        }
    }
}

I was able to respond with the following methods:我能够用以下方法做出回应:

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

First, I have created a Database and Table with this Code:首先,我使用以下代码创建了一个数据库和表:

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
)

Second, I have created log4net.config File in program .其次,我在程序中创建了 log4net.config 文件。 This is a simple configuration with no customization on the log message:这是一个简单的配置,没有对日志消息进行自定义:

<?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>

Third, I have replaced the code below with IHostBuilder :第三,我用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>();

Fourth, in appsettings.json I have inserted this code:第四,在appsettings.json我插入了这段代码:

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

At the end, I have used these commands to enjoy logging in最后,我使用这些命令享受登录

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...
} 

Good luck.祝你好运。

Using Microsoft.Extensions.Logging.Log4Net.AspNetCore is easy to config.使用 Microsoft.Extensions.Logging.Log4Net.AspNetCore 很容易配置。

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

For me the only thing that worked was to install additional Nuget Package:对我来说,唯一有效的是安装额外的 Nuget 包:

Serilog.Extensions.Logging.File

Of course including Microsoft.Extensions.Logging.Log4Net.AspNetCore当然包括Microsoft.Extensions.Logging.Log4Net.AspNetCore

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM