Je configure log4net
dans mon application asp.net core 2.0, comme mentionné dans cet article LINK
programme.cs
public static void Main(string[] args)
{
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
BuildWebHost(args).Run();
}
AccueilContrôleur
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>
Malchanceux !, Je n'ai vu aucun fichier généré dans le répertoire C:\Temp\app.log
. Quelle serait l'erreur? comment configurer log4net
pour asp.net core 2.0?
Je parviens à enregistrer un fichier avec le code suivant
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 à la racine du site
<?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>
Notez qu’il existe déjà un adaptateur log4net pour l’interface de journalisation ASP.NET Core.
La seule chose à faire est de passer la ILoggerFactory
à votre classe Startup
, puis d'appeler
loggerFactory.AddLog4Net();
et avoir une configuration en place. Ainsi, vous n'avez pas à écrire de code de placage de chaudière.
https://github.com/huorswords/Microsoft.Extensions.Logging.Log4Net.AspNetCore
Vous devez installer le package Microsoft.Extensions.Logging.Log4Net.AspNetCore NuGet et ajouter un fichier log4net.config à votre application. Alors cela devrait fonctionner:
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");
}
}
Suite à la réponse d'Irfan, j'ai la configuration XML suivante sur OSX avec .NET Core 2.1.300 qui enregistre et ajoute correctement à un dossier ./log
ainsi qu'à la console. Notez que log4net.config
doit exister à la racine de la solution (alors que dans mon cas, la racine de mon application est un sous-dossier).
<?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>
Autre remarque, la méthode traditionnelle de configuration du code XML dans app.config
ne fonctionnait pas:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net> ...
Pour une raison quelconque, le noeud log4net n'a pas été trouvé lors de l'accès au XMLDocument via log4netConfig["log4net"]
.
Toujours à la recherche d'une solution? J'ai eu le mien de ce lien .
Tout ce que j'avais à faire, c'était d'ajouter ces deux lignes de code en haut de la méthode "public static void Main" dans la "classe de programme".
var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));
Oui, vous devez ajouter:
Vous pouvez également configurer votre application principale asp.net de manière à ce que tout ce qui est enregistré dans la console de sortie le soit dans l'appendeur de votre choix. Vous pouvez également télécharger cet exemple de code à partir de github et voir comment je l’ai configuré.