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?
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>
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
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");
}
}
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.
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.
Fügen Sie die Datei log4net.config in Ihrem Stammanwendungsordner hinzu
Ö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 (); . ... }
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
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:
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.