web-dev-qa-db-fra.com

Comment désactiver la journalisation effectuée par le framework principal ASP.NET

Comment désactiver la journalisation effectuée par ASP.NET pour chaque demande, par exemple.

INFO 09:38:41 Le profil de l'utilisateur est disponible. Utilisation de 'C:\Utilisateurs\xxxx xxxx\AppData\Local\ASP.NET\DataProtection-Keys' comme référentiel de clés et Windows DPAPI pour chiffrer les clés au repos.
DEBUG 09:38:41 Hébergement à partir
DEBUG 09:38:41 Hébergement commencé
INFO 09:38:41 Demande à partir de HTTP/1.1 GET http: // localhost: 23369 /
INFO 09:38:41 Demande à partir de HTTP/1.1 DEBUG http: // localhost: 23369 / text/html DEBUG 09:38:41 Les demandes DEBUG ne sont pas prises en charge.
DEBUG 09:38:41 Le chemin de la demande/ne correspond pas à un type de fichier pris en charge
DEBUG 09:38:41 La demande a correspondu à la route avec le nom 'default' et le modèle '{controller = Home}/{action = Index}/{id?}'. DEBUG 09:38:41 La demande a réussi à faire correspondre l'itinéraire avec le nom 'default' et le modèle '{controller = Home}/{action = Index}/{id?}'. DEBUG 09:38:41 Exécution de l'action Forums.Controllers.HomeController.Index
DEBUG 09:38:41 Exécution de l'action Forums.Controllers.HomeController.Index
INFO 09:38:41 Exécution de la méthode d'action Forums.Controllers.HomeController.Index avec arguments () - ModelState is Valid '
INFO 09:38:41 Exécution de la méthode d'action Forums.Controllers.HomeController.Index
..

Je ne pouvais pas encore trouver comment désactiver cette journalisation ...

Voici ma méthode Configure dans la classe Startup:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddProvider(new Log4NetProvider());

    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");

        // For more details on creating database during deployment see http://go.Microsoft.com/fwlink/?LinkID=615859
        try
        {
            using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                .CreateScope())
            {
                serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
                     .Database.Migrate();
            }
        }
        catch { }
    }

    app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());

    app.UseStaticFiles();

    app.UseIdentity();

    // To configure external authentication please see http://go.Microsoft.com/fwlink/?LinkID=532715

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Et voici mon fichier project.json:

"dependencies": {
  "EntityFramework.Commands": "7.0.0-rc1-final",
  "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
  "log4net": "2.0.5",
  "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
  "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
  "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
  "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
  "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
  "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
  "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
  "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
  "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
  "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
  "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
  "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
  "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
  "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
  "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"
},

"commands": {
  "web": "Microsoft.AspNet.Server.Kestrel",
  "ef": "EntityFramework.Commands"
},

"frameworks": {
  "dnx451": { }
},

Mise à jour:
Mon fournisseur log4net a été choisi à partir d'ici

50
gdoron

Je ne sais pas s'il me manque quelque chose, mais ne voulez-vous pas simplement augmenter le niveau de journalisation des journaux Microsoft?

Modifier appsettings.json (En supposant que .AddJsonFile("appsettings.json", ...))

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Trace",
      "System": "Information",
      "Microsoft": "Information"

À

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Trace",
      "System": "Information",
      "Microsoft": "None"

Ou la même modification via des variables d'environnement (en supposant que .AddEnvironmentVariables())

Logging:LogLevel:Microsoft=None

Vous pouvez également être plus spécifique, ce qui suit réduit la plupart des entrées mais laisse Microsoft.AspNetCore.Hosting.Internal.WebHost À Information.

"Microsoft": "Information",  
"Microsoft.AspNetCore.Mvc.Internal": "Warning",
"Microsoft.AspNetCore.Authentication":  "Warning"

Appologies si cela ne fonctionne pas pour log4net

58
KCD

Si vous utilisez Serilog pour effectuer votre journalisation principale .Net, vous pouvez mettre à jour votre fichier appsettings.json afin de définir les niveaux de journalisation, comme suit:

"Serilog": {
  "MinimumLevel": {
    "Default": "Verbose",
    "Override": {
      "Microsoft": "Error",
      "System": "Error"
    }
  },
  "Properties": {
    "Application": "your-app"
  }
}

Cela vous permet de ne consigner que les erreurs provenant de System/Microsoft tout en enregistrant le reste comme vous le souhaitez.

23
Tony Ranieri

Ce qui a vraiment fonctionné pour moi, c’est d’ajouter ceci dans le fichier Startup.cs Du projet ASP.NET Core 2.0:

public void ConfigureServices(IServiceCollection services)
{
    .
    .
    .

    services.AddLogging(
    builder =>
    {
        builder.AddFilter("Microsoft", LogLevel.Warning)
               .AddFilter("System", LogLevel.Warning)
               .AddFilter("NToastNotify", LogLevel.Warning)
               .AddConsole();
    });
}

De cette façon, vous n'obtiendrez que les journaux de niveau d'avertissement pour les informations de journalisation commençant par les filtres passés à builder.AddFilter.

Mon fichier log4net.log ne montre pas cette énorme quantité de INFO journalisation crachée par Microsoft et autres.

Plus d'informations ici @ Microsoft Docs: Filtrage des journaux

19
Leniel Maccaferri

Puisque la nouvelle infrastructure de journalisation est utilisée (par conception) par asp.net lui-même (ainsi que par le code d'un autre fournisseur), il appartient à l'implémentation ILoggerProvider de décider si elle souhaite journaliser cette source ou non.

Voici une mise en œuvre révisée pour log4net qui ajoute un filtrage de base à la source:

public class Log4NetProvider : ILoggerProvider
{
    private static readonly NoopLogger _noopLogger = new NoopLogger();
    private readonly Func<string, bool> _sourceFilterFunc;
    private readonly ConcurrentDictionary<string, Log4NetLogger> _loggers = new ConcurrentDictionary<string, Log4NetLogger>();

    public Log4NetProvider(Func<string, bool> sourceFilterFunc = null)
    {
        _sourceFilterFunc = sourceFilterFunc != null ? sourceFilterFunc : x => true;
    }

    public ILogger CreateLogger(string name)
    {
        if (!_sourceFilterFunc(name))
            return _noopLogger;

        return _loggers.GetOrAdd(name, x => new Log4NetLogger(name));
    }

    public void Dispose()
    {
        _loggers.Clear();
    }

    private class NoopLogger : ILogger
    {
        public IDisposable BeginScopeImpl(object state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return false;
        }

        public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
        {
        }
    }
}

Et le Log4NetAspExtensions:

public static void ConfigureLog4Net(this IApplicationEnvironment appEnv, string configFileRelativePath)
{
    GlobalContext.Properties["appRoot"] = appEnv.ApplicationBasePath;
    XmlConfigurator.Configure(new FileInfo(Path.Combine(appEnv.ApplicationBasePath, configFileRelativePath)));
}

public static void AddLog4Net(this ILoggerFactory loggerFactory, Func<string, bool> sourceFilterFunc = null)
{
    loggerFactory.AddProvider(new Log4NetProvider(sourceFilterFunc));
}

public static void AddLog4Net(this ILoggerFactory loggerFactory)
{
    loggerFactory.AddLog4Net(null);
}

Utilisation possible (en Startup.cs):

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv, ILoggerFactory loggerFactory)
{
    appEnv.ConfigureLog4Net("log4net.xml");

    loggerFactory.AddLog4Net(x => !x.StartsWith("Microsoft."));
}
7
haim770

Dans et avant ASP.NET 5 RC1 (maintenant ASP.NET Core 1.0), vous pouviez le faire via l’usine de journalisation, c.-à-d.

_public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // completely disable logging or use one of the other levels, such as Error, Critical, Warning etc. 
    loggerFactory.MinimumLevel = LogLevel.None;
}
_

Cependant, avec la branche actuelle (pas encore publié, mais disponible via des versions nocturnes), cela a été supprimé. Vous devez maintenant passer le LogLevel par fournisseur. Cela se fait généralement via une méthode d'extension.

Pour le consignateur intégré, il s'agirait de loggerFactory.AddConsole(minimumLevel: LogLevel.Warning); par exemple.

Étant donné que votre fournisseur d’enregistreur est personnalisé, vous devrez le configurer vous-même. Regardez comment le consignateur de la console le fait. Il passe un délégué au fournisseur, qui effectue le filtrage.

De Source GitHub :

_public static ILoggerFactory AddConsole(
    this ILoggerFactory factory,
    LogLevel minLevel,
    bool includeScopes)
{
    factory.AddConsole((category, logLevel) => logLevel >= minLevel, includeScopes);
    return factory;
}
_

Bien sûr, au lieu de passer un délégué, vous pouvez également définir directement le niveau de journalisation de log4net.

Update : pour étendre ce que j'ai souligné dans les commentaires.

Le ILoggerProvider n’est qu’une enveloppe autour du cadre de journalisation proprement dit. Dans le cas simple de ConsoleLoggerProvider, il n'y a pas de cadre, mais un simple appel _Console.WriteLine_.

Dans le cas de log4net, il ressort clairement de l'exemple que la journalisation peut être activée par niveau. Ce n'est pas possible avec l'abstraction de l'enregistreur .NET Core appréciée ci-dessus, car l'abstraction ne fait aucun filtrage.

Dans un log4net ILoggerProvider, il suffit de router tous les niveaux de journalisation vers la bibliothèque réseau log4net et de le filtrer.

Sur la base du numéro lié de GitHub @ haim770 créé, vous disposez du SourceContext pour le filtrage et si log4net n'a pas de concept de SourceContext, vous devrez l'implémenter dans le fournisseur. S'il a un concept de SourceContext, le fournisseur doit alors le rediriger/le traduire dans la structure que log4net attend.

Comme vous pouvez le constater, l'enregistreur lui-même reste toujours inconscient des spécificités internes et des détails d'implémentation d'ASP.NET. Le _Log4NetProvider_ ne peut ni ne devrait, car sa tâche est de traduire/encapsuler cette API. Les fournisseurs ne sont que des abstractions. Par exemple, nous n'avons pas à divulguer les détails de la mise en œuvre dans une bibliothèque.

4
Tseng