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