Как использовать log4net в Asp.net core 2.0

Настроить log4net в моем ядре ASP.NET 2.0 приложения, как указано в этой статье LINK

Program.cs

public static void Main(string[] args)
{
    var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
    XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

    BuildWebHost(args).Run();
}

HomeController

public class HomeController : Controller
{
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(HomeController));

    public IActionResult Error()
    {
        log.Info("Hello logging world!");
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

log4net.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingFile" />
    </root>
    <appender name="RollingFile" type="log4net.Appender.FileAppender">
      <file value="‪C:\Temp\app.log" /> 
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5p %d{hh:mm:ss} %message%newline" />
      </layout>
    </appender>
  </log4net>
</configuration>

Неудачный !, я не видел файл, созданный в C: C:\Temp\app.log каталог. В чем будет ошибка? как настроить log4net для asp.net core 2.0?

Ответ 1

Я успешно могу зарегистрировать файл, используя следующий код

public static void Main(string[] args)
{
    XmlDocument log4netConfig = new XmlDocument();
    log4netConfig.Load(File.OpenRead("log4net.config"));
    var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(),
               typeof(log4net.Repository.Hierarchy.Hierarchy));
    log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);

    BuildWebHost(args).Run();
}

log4net.config в корне сайта

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
    <file value="C:\Temp\" />
    <datePattern value="yyyy-MM-dd.'txt'"/>
    <staticLogFileName value="false"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <maxSizeRollBackups value="100"/>
    <maximumFileSize value="15MB"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level App  %newline %message %newline %newline"/>
    </layout>
  </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
</log4net>

Ответ 2

Извините за задержку!

В моем сценарии все это касается схемы .config. выше одного было создано с .config просто, так что это беспокоит меня. Если бы я создал файл конфигурации через схему выше кода, то он отлично работает.

Ответ 3

Существует сторонний адаптер log4net для интерфейса ведения журнала ASP.NET Core.

Единственное, что вам нужно сделать, это передать ILoggerFactory вашему классу Startup, а затем вызвать

loggerFactory.AddLog4Net();

и иметь конфиг на месте. Так что вам не нужно писать какой-либо код котельной плиты.

Больше информации здесь

Ответ 4

Все еще ищете решение? Я получил мой по этой ссылке.

Все, что мне нужно было сделать, это добавить эти две строки кода в начало метода public static void Main в "классе программы".

 var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
 XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

Да, вы должны добавить:

  1. Microsoft.Extensions.Logging.Log4Net.AspNetCore с использованием NuGet.
  2. Текстовый файл с именем log4net.config и измените свойство (Копировать в выходной каталог) файла на "Копировать, если новее" или "Копировать всегда".

Вы также можете настроить свое основное приложение asp.net таким образом, чтобы все, что регистрировалось в консоли вывода, было зарегистрировано в выбранном вами приложении. Вы также можете скачать этот пример кода с github и посмотреть, как я его настроил.

Ответ 5

Вам необходимо установить пакет Microsoft.Extensions.Logging.Log4Net.AspNetCore NuGet и добавить файл log4net.config в свое приложение. Тогда это должно работать:

public class Program
{
    private readonly ILogger<Program> logger;

    public Program()
    {
        var services = new ServiceCollection()
            .AddLogging(logBuilder => logBuilder.SetMinimumLevel(LogLevel.Debug))
            .BuildServiceProvider();


        logger = services.GetService<ILoggerFactory>()
            .AddLog4Net()
            .CreateLogger<Program>();
    }

    static void Main(string[] args)
    {
        Program program = new Program();

        program.Run();

        Console.WriteLine("\n\nPress any key to continue...");
        Console.ReadKey();
    }

    private void Run()
    {
        logger.LogInformation("Logging is working");
    }
}

Ответ 6

Следуя примеру Irfan, у меня есть следующая конфигурация XML в OSX с.NET Core 2.1.300, которая правильно регистрируется и добавляется в папку ./log а также на консоль. Обратите внимание, что log4net.config должен существовать в корне решения (тогда как в моем случае мой корень приложения является подпапкой).

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
      <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %-5level %logger - %message%newline" />
      </layout>
  </appender>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
    <file value="logs/" />
    <datePattern value="yyyy-MM-dd.'txt'"/>
    <staticLogFileName value="false"/>
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <maxSizeRollBackups value="100"/>
    <maximumFileSize value="15MB"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level App  %newline %message %newline %newline"/>
    </layout>
  </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingLogFileAppender"/>
      <appender-ref ref="ConsoleAppender"/>
    </root>
</log4net>

Другое примечание: традиционный способ установки XML в app.config не работал:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net> ...

По какой-то причине узел log4net не был найден при доступе к XMLDocument через log4netConfig["log4net"].

Ответ 7

Я выяснил, в чем проблема пространства имен неоднозначно в loggerFactory.AddLog4Net(). Вот краткое описание того, как я добавил log4Net в свой проект Asp.Net Core.

  1. Добавьте пакет слепков Microsoft.Extensions.Logging.Log4Net.AspNetCore
  2. Добавьте файл log4net.config в корневую папку приложения

  3. Откройте файл Startup.cs и измените метод Configure, чтобы добавить поддержку log4net с этой строкой loggerFactory.AddLog4Net

                 Сначала вы должны импортировать пакет, используя Microsoft.Extensions.Logging; используя оператор использования

Вот весь метод, вы должны префикс интерфейса ILoggerFactory с пространством имен

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, NorthwindContext context, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory)
        {
            loggerFactory.AddLog4Net();
            ....
        }

Ответ 8

Нажмите здесь, чтобы узнать, как реализовать log4net в .NET Core 2.2

Следующие шаги взяты из приведенной выше ссылки и описывают, как добавить log4net в проект .NET Core 2.2.

Сначала выполните следующую команду в консоли диспетчера пакетов:

Install-Package Log4Net_Logging -Version 1.0.0

Затем добавьте log4net.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="logfile.log" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d [%t] %-5p - %m%n" />
      </layout>
    </appender>
    <root>
      <!--LogLevel: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
      <level value="ALL" />
      <appender-ref ref="FileAppender" />
    </root>
  </log4net>
</configuration>

Затем добавьте следующий код в контроллер (это пример, пожалуйста, отредактируйте его перед добавлением в контроллер):

public ValuesController()
{
    LogFourNet.SetUp(Assembly.GetEntryAssembly(), "log4net.config");
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
    LogFourNet.Info(this, "This is Info logging");
    LogFourNet.Debug(this, "This is Debug logging");
    LogFourNet.Error(this, "This is Error logging");    
    return new string[] { "value1", "value2" };
}

Затем вызовите соответствующее действие контроллера (в приведенном выше примере вызовите /Values/Get with HTTP GET), и вы получите результат, соответствующий следующему:

2019-06-05 19: 58: 45,103 [9] INFO- [Log4NetLogging_Project.Controllers.ValuesController.Get: 23] - это ведение журнала информации