wake-up-neo.com

Verwendung von log4net in Asp.net core 2.0

Ich konfiguriere log4net in meiner asp.net core 2.0-Anwendung wie in diesem Artikel erwähnt 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>

Pech gehabt! Ich habe keine Datei im C:\Temp\app.log-Verzeichnis gesehen. Was wäre der Fehler? Wie konfiguriere ich log4net für asp.net core 2.0? 

25
k11k2

Ich kann erfolgreich eine Datei mit folgendem Code protokollieren

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 im Website-Stammverzeichnis

<?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>
27
Irfan Ashraf

Beachten Sie, dass es bereits einen log4net-Adapter für die ASP.NET Core-Protokollierungsschnittstelle gibt.

Sie müssen lediglich die Variable ILoggerFactory an Ihre Klasse Startup übergeben und dann aufrufen

loggerFactory.AddLog4Net();

und habe eine config eingerichtet. Sie müssen also keinen Boiler-Plattierungscode schreiben.

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

17
Jan Muncinsky

Sie müssen das NuGet-Paket Microsoft.Extensions.Logging.Log4Net.AspNetCore installieren und Ihrer Anwendung eine log4net.config-Datei hinzufügen. Dann sollte das funktionieren:

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");
    }
}
1
Jonny

Nach der Antwort von Irfan habe ich unter OSX mit .NET Core 2.1.300 die folgende XML-Konfiguration, die korrekt protokolliert und an einen ./log-Ordner sowie an die Konsole angehängt wird. Beachten Sie, dass log4net.config im Lösungsstammverzeichnis vorhanden sein muss (in meinem Fall ist mein App-Stammordner ein Unterordner).

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

Ein weiterer Hinweis, die traditionelle Art und Weise, wie Sie XML in app.config einrichten, hat nicht funktioniert:

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

Aus irgendeinem Grund wurde der log4net-Knoten beim Zugriff auf das XMLDocument über log4netConfig["log4net"] nicht gefunden.

1
Shane

Ich habe herausgefunden, was das Problem ist, dass der Namespace in loggerFactory.AddLog4Net () ambitioniert ist. Hier ist eine kurze Zusammenfassung, wie ich meinem Asp.Net Core-Projekt log4Net hinzugefügt habe.

  1. Fügen Sie das Nugget-Paket Microsoft.Extensions.Logging.Log4Net.AspNetCore hinzu
  2. Fügen Sie die Datei log4net.config in Ihrem Stammanwendungsordner hinzu

  3. Öffnen Sie die Datei Startup.cs und ändern Sie die Methode Configure, um mit dieser Zeile loggerFactory.AddLog4Net log4net-Unterstützung hinzuzufügen

Zuerst müssen Sie das Paket mit Microsoft.Extensions.Logging importieren. mit der using-Anweisung

Hier ist die gesamte Methode, Sie müssen der ILoggerFactory-Schnittstelle den Namespace voranstellen

 public void Configure (IApplicationBuilder-App, IHostingEnvironment-Umgebung, NorthwindContext-Kontext, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) 
 {
 loggerFactory.AddLog4Net (); 
. ... 
} 
1
techjunkie

Klicken Sie auf hier , um zu erfahren, wie Sie log4net in .NET Core 2.2 implementieren

Die folgenden Schritte werden über den obigen Link ausgeführt und zeigen, wie log4net einem .NET Core 2.2-Projekt hinzugefügt wird.

Führen Sie zunächst den folgenden Befehl in der Package-Manager-Konsole aus:

Install-Package Log4Net_Logging -Version 1.0.0

Fügen Sie dann eine log4net.config mit den folgenden Informationen hinzu (passen Sie sie bitte an Ihre Einrichtung an):

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

Fügen Sie dann den folgenden Code zu einem Controller hinzu (dies ist ein Beispiel. Bitte bearbeiten Sie ihn, bevor Sie ihn zu Ihrem Controller hinzufügen):

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" };
}

Rufen Sie dann die entsprechende Controller-Aktion auf (rufen Sie im obigen Beispiel /Values/Get Mit einem HTTP-GET auf), und Sie erhalten die folgende Ausgabe:

2019-06-05 19: 58: 45,103 [9] INFO- [Log4NetLogging_Project.Controllers.ValuesController.Get: 23] - Dies ist die Info-Protokollierung

0
Shani Bhati

Suchen Sie noch nach einer Lösung? Ich habe meine von diesem link .

Alles, was ich tun musste, war, diese zwei Codezeilen oben in der "public static void Main" -Methode in der "Programmklasse" hinzuzufügen.

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

Ja, Sie müssen hinzufügen:

  1. Microsoft.Extensions.Logging.Log4Net.AspNetCore mit NuGet.
  2. Eine Textdatei mit dem Namen log4net.config und ändern Sie die Eigenschaft (Copy to Output Directory) der Datei in "Copy if Newer" oder "Copy always".

Sie können Ihre asp.net-Kernanwendung auch so konfigurieren, dass alles, was in der Ausgabekonsole angemeldet ist, im Appender Ihrer Wahl protokolliert wird. Sie können diesen Beispielcode auch von github herunterladen und sehen, wie ich ihn konfiguriert habe.

0
Kwame