Самый простой правильный способ настроить log4net для приложения .Net Core 3.1

Я изо всех сил пытаюсь понять самый простой способ настроить 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, чего я бы хотел избежать. Я ожидал, что это будет легко, поэтому извиняюсь, если я упустил очевидный подход.


person user304582    schedule 12.12.2019    source источник
comment
К сожалению, у меня нет ответа, но я столкнусь с этой же проблемой в будущем. Помогает ли эта статья в .NET Core 3.1?   -  person KevinLamb    schedule 12.12.2019
comment
Core 3 теперь идет с логированием. Есть ли причина, по которой вы хотите продолжать использовать log4net?   -  person Nikki9696    schedule 12.12.2019
comment
Я думаю, вам все еще нужна третья сторона, поскольку ее нет для входа в файл, см. Здесь docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/   -  person Otake    schedule 20.01.2020


Ответы (4)


Немного отредактировав свой ответ, чтобы было ясно, что Core НЕ включает в себя обычный регистратор файлов из коробки. Виноват. (по состоянию на 19.05.2020)

Я бы рекомендовал использовать расширения ведения журнала от 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();
            }
        }
    }
}
person Nikki9696    schedule 12.12.2019
comment
Спасибо - это выглядит очень полезным, и комментарий Кевина Лэмба указывает на статью в том же духе. Думаю, я просто удивлен, что не могу использовать файл runtimeconfig.json с log4net - это кажется наиболее естественным сочетанием. Я использую log4net только потому, что мне это удобнее всего, но я также рассмотрю встроенные возможности ведения журнала. Спасибо за помощь ребята! - person user304582; 13.12.2019
comment
@ nikki9696 вы имеете в виду ILogger? есть ли какое-либо другое расширение Microsoft, которое может регистрироваться в текстовом файле / - person Dragon; 13.05.2020
comment
@Dragon, мои извинения, нет, я не понимал, что они не предоставляют регистратор файлов из коробки. Вам придется свернуть одну или использовать одну из сторонних библиотек, например log4net или serilog. Какая неудача. Похоже, они активно продвигают Azure. И я был так взволнован встроенной лесозаготовкой. : / - person Nikki9696; 20.05.2020

Я смог ответить следующими способами:

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

Сначала я создал базу данных и таблицу с этим кодом:

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

Удачи.

person Milad Safari    schedule 02.09.2020

Использование Microsoft.Extensions.Logging.Log4Net.AspNetCore легко настроить.

См .: https://github.com/huorswords/Microsoft.Extensions.Logging.Log4Net.AspNetCore

person 陈伟峰    schedule 18.06.2020
comment
Документация по этой ссылке не очень полезна. Они создают файл log4net.config, но никогда его не загружают. - person d00d; 28.06.2021

Для меня единственное, что сработало, - это установить дополнительный пакет Nuget:

Serilog.Extensions.Logging.File

Конечно, включая Microsoft.Extensions.Logging.Log4Net.AspNetCore

person Ben    schedule 17.05.2021