如何关闭ASP.NET核心框架完成的日志记录

gdo*_*ica 52 c# logging asp.net-core

如何为每个请求关闭ASP.NET完成的日志记录,例如:

INFO 09:38:41用户个人资料可用.使用'C:\ Users\xxxx xxxx\AppData\Local\ASP.NET\DataProtection-Keys'作为密钥存储库,使用Windows DPAPI加密静态密钥.
DEBUG 9时38分41秒开始托管
DEBUG 9时38分41秒开始托管
INFO 9时38分41秒开始请求HTTP/1.1 GET 的http://本地主机:23369 /
INFO 9时38分41秒开始请求HTTP/1.1 DEBUG HTTP: // localhost:23369 / text/html DEBUG 09:38:41不支持
DEBUG请求DEBUG 09:38:41请求路径/与支持的文件类型不匹配
DEBUG 09:38:41请求成功匹配路线名称'default'和模板'{controller = Home}/{action = Index}/{id?}'.DEBUG 09:38:41请求成功匹配路线名称'default'和模板'{controller = Home}/{action = Index}/{id?}'.DEBUG 9时38分41秒执行动作Forums.Controllers.HomeController.Index
DEBUG 9时38分41秒执行动作Forums.Controllers.HomeController.Index
INFO 9时38分41秒执行一个带有参数的操作方法Forums.Controllers.HomeController.Index() - ModelState is
Valid'INFO 09:38:41执行动作方法Forums.Controllers.HomeController.Index
..

我还没找到如何关闭这个日志...

这是我班上的Configure方法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?}");
    });
}
Run Code Online (Sandbox Code Playgroud)

这是我的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": { }
},
Run Code Online (Sandbox Code Playgroud)

更新:
我的log4net提供程序是从这里获取的

KCD*_*KCD 67

我不确定我是否遗漏了一些内容,但是你不想提高Microsoft日志的日志级别吗?

编辑appsettings.json(假设.AddJsonFile("appsettings.json", ...))

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Trace",
      "System": "Information",
      "Microsoft": "Information"
Run Code Online (Sandbox Code Playgroud)

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Trace",
      "System": "Information",
      "Microsoft": "None"
Run Code Online (Sandbox Code Playgroud)

或者通过环境变量进行相同的修改(假设.AddEnvironmentVariables())

Logging:LogLevel:Microsoft=None
Run Code Online (Sandbox Code Playgroud)

您也可以更具体,以下内容减少了大多数条目,但留下Microsoft.AspNetCore.Hosting.Internal.WebHostInformation.

"Microsoft": "Information",  
"Microsoft.AspNetCore.Mvc.Internal": "Warning",
"Microsoft.AspNetCore.Authentication":  "Warning"
Run Code Online (Sandbox Code Playgroud)

如果这不起作用的应用程序 log4net

  • 我无法让它与Serilog一起工作,但它在命令行上运行应用程序(即运行dotnet)时对控制台日志记录有效. (5认同)
  • @Alyce Serilog也有过滤功能:`new LoggerConfiguration().Filter.ByExcluding(Matching.FromSource("Microsoft"))` - 有关详细信息,请参阅此内容:http://stackoverflow.com/questions/38760381/multiple-过滤器换一个记录器与 - serilog (4认同)
  • 您还可以覆盖,以便通过使用`new LoggerConfiguration()仅记录特定源的特定级别以上的事件.MinimumLevel.Override("Microsoft",LogEventLevel.Warning)` (3认同)
  • 不幸的是,这个配置文件仅用于控制控制台日志记录。`loggerFactory.AddConsole(Configuration.GetSection("日志记录"));` (2认同)
  • 噢,这就是Microsoft和System那些奇怪的“ LogLevels”的作用……我没意识到。很棒的小费。 (2认同)

Ton*_*eri 24

如果您使用Serilog进行.Net核心日志记录,则可以更新appsettings.json文件以设置日志级别,如下所示:

"Serilog": {
  "MinimumLevel": {
    "Default": "Verbose",
    "Override": {
      "Microsoft": "Error",
      "System": "Error"
    }
  },
  "Properties": {
    "Application": "your-app"
  }
}
Run Code Online (Sandbox Code Playgroud)

这允许您只记录System/Microsoft中的错误,同时根据需要记录其他所有内容.

  • 这为我完成了工作。谢谢。 (2认同)

Len*_*rri 20

对我来说真正有用的是在ASP.NET Core 2.0项目的Startup.cs文件中添加它:

public void ConfigureServices(IServiceCollection services)
{
    .
    .
    .

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

这样,您只会从传递到的过滤器开始获取日志信息的警告级别日志builder.AddFilter.

我的log4net.log文件现在没有显示INFO微软和其他人大量的日志记录.

更多信息@ Microsoft Docs:日志过滤

  • 对于像我这样的新手,请添加“using Microsoft.Extensions.Logging;” (5认同)

Cas*_*sey 18

在ASP.NET Core版本3中,您可以在ConfigureServices函数中清除现有的日志提供程序:

public void ConfigureServices(IServiceCollection services) {
    //Do everything else...
    services.AddLogging(c => c.ClearProviders());
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用。ASP.NET core 仍在记录:'( (4认同)

hai*_*770 7

由于新的日志记录基础结构(由设计)由asp.net本身(以及其他供应商代码)使用,因此由ILoggerProvider实现决定是否要记录该源.

这是一个经过修改的实现,log4net它增加了一个基本的源过滤:

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)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

而且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);
}
Run Code Online (Sandbox Code Playgroud)

可能的用法(in Startup.cs):

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

    loggerFactory.AddLog4Net(x => !x.StartsWith("Microsoft."));
}
Run Code Online (Sandbox Code Playgroud)


Tse*_*eng 5

在ASP.NET 5 RC1(现在是ASP.NET Core 1.0)之前和之后,您可以通过记录器工厂来完成,即

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;
}
Run Code Online (Sandbox Code Playgroud)

但是,对于当前分支(尚未发布,但可通过夜间构建获得),此内容已被删除.现在您需要传递LogLevel每个提供程序.通常,这是通过扩展方法完成的.

对于内置的控制台记录器,它将是loggerFactory.AddConsole(minimumLevel: LogLevel.Warning);例如.

由于您的记录器提供程序是自定义的,因此您必须自己配置它.看看控制台记录器是如何做到的.它将委托传递给提供者,进行过滤.

来自GitHub来源:

public static ILoggerFactory AddConsole(
    this ILoggerFactory factory,
    LogLevel minLevel,
    bool includeScopes)
{
    factory.AddConsole((category, logLevel) => logLevel >= minLevel, includeScopes);
    return factory;
}
Run Code Online (Sandbox Code Playgroud)

当然,您也可以直接设置log4net的日志级别,而不是传递委托.

更新:扩展我在评论中指出的内容

ILoggerProvider大约只有实际的日志框架的包装.在简单的情况下ConsoleLoggerProvider,它背后没有框架,只是一个简单的Console.WriteLine调用.

对于log4net,从示例中可以明显看出,可以在每个级别上启用日志记录.对于上面提到的.NET Core logger抽象,这是不可能的,因为抽象不会进行任何过滤.

在log4net中ILoggerProvider,只需将所有日志级别路由到log4net网络库并对其进行过滤即可.

基于链接的GitHub问题@ haim770创建,您有SourceContext用于过滤,如果log4net没有SourceContext的概念,您必须在提供程序中实现它.如果它具有SourceContext的概念,那么提供者需要将其重新路由/转换为log4net期望的结构.

如您所见,记录器本身始终不了解ASP.NET的内部细节和实现细节.将Log4NetProvider不能,也不应该,因为它的任务是翻译/环绕该API.提供者只是抽象,因此我们不必将实现细节泄露到库中.


isa*_*pir 5

Setting Logging.LogLevel in appsettings.json for the key Microsoft was not enough. I had to specifically set the following keys specifically, e.g.:

"Microsoft.Hosting.Lifetime": "Warning",
"Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
"Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware": "Warning"
Run Code Online (Sandbox Code Playgroud)

But as an alternative using a key with a wildcard, e.g. Microsoft.*, worked. So I ended up with:

{
  "Logging": {
    "LogLevel": {
      "Default":     "Warning",
      "Microsoft.*": "Warning" 
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)