web-dev-qa-db-fra.com

Comment utiliser log4net dans Asp.net core 2.0

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? 

25
k11k2

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

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

17
Jan Muncinsky

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

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"].

1
Shane

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:

  1. Microsoft.Extensions.Logging.Log4Net.AspNetCore utilisant NuGet.
  2. Un fichier texte portant le nom log4net.config et remplacez la propriété (Copier dans le répertoire de sortie) du fichier par "Copier si nouveau" ou "Copier toujours".

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

0
Kwame