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


72

如何关闭ASP.NET对每个请求的日志记录,例如

INFO 09:38:41用户个人资料可用。使用“ C:\ Users \ xxxx xxxx \ AppData \ Local \ ASP.NET \ DataProtection-Keys”作为密钥存储库,并使用Windows DPAPI加密静态密钥。
DEBUG 09:38:41托管启动
DEBUG 09:38:41托管启动
INFO 09:38:41请求启动HTTP / 1.1 GET http:// localhost:23369 /
INFO 09: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 09:38:41执行动作Forums.Controllers.HomeController.Index
DEBUG 09:38:41执行动作Forums.Controllers.HomeController.Index
INFO 09:38:41执行动作方法Forums.Controllers.HomeController.Index带参数()
-ModelState是有效的' INFO 09:38:41执行操作方法Forums.Controllers.HomeController.Index
..

我仍然找不到如何关闭此日志记录的功能...

这是我ConfigureStartup课堂上的方法:

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

这是我的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": { }
},

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


1
1.您要关闭的日志到底在哪里?2.如何托管您的应用程序?
haim770 '16

@ haim770,我不明白第一个问题。2. IIS Express。
gdoron支持Monica

您已明确注册log4net为日志记录提供者。是否log4net要关闭日志?您在控制台中看到了什么吗?您是否只想更改跟踪级别?
haim770 '16

@haim,我认为它与log4net没有任何关系,它是我编写的适配器,它无法访问asp.net管道,这意味着asp.net在内部调用了记录器工厂。
gdoron支持Monica

1
您没有指定要在哪里查看/查找要禁用的日志,因此我不得不假定它是log4net输出。同样,您在哪里看到DEBUG 09:38:41 Hosting starting线?
haim770 '16

Answers:


83

我不确定是否丢失了某些内容,但是您是否不只是想提高Microsoft日志的日志级别?

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

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

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

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

Logging:LogLevel:Microsoft=None

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

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

应用程序,如果这不适用于 log4net


8
我无法将其与Serilog一起使用,但是当在命令行上运行应用程序(即dotnet run)时,它确实适用于控制台日志记录。
艾丽斯

1
不幸的是,此配置文件仅用于控制控制台日志记录。 loggerFactory.AddConsole(Configuration.GetSection("Logging"));
斯科特

5
@Alyce Serilog有可用的过滤,以及:new LoggerConfiguration().Filter.ByExcluding(Matching.FromSource("Microsoft"))-看到更多信息:stackoverflow.com/questions/38760381/...
玛尼Gandham

3
您还可以使用new LoggerConfiguration().MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
Mani Gandham,

2
噢,这就是Microsoft和System那些奇怪的“ LogLevels”的作用……我没有意识到这一点。很棒的小费。
迈克·格莱德希尔

37

对我真正起作用的是在ASP.NET Core 2.0项目的Startup.cs文件中添加了此代码:

using Microsoft.Extensions.Logging;
public void ConfigureServices(IServiceCollection services)
{
    .
    .
    .

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

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

我的log4net.log文件现在没有显示INFOMicrosoft和其他人吐出的大量日志。

在此处获取更多信息@ Microsoft Docs:日志过滤


4
对于像我这样的菜鸟,请添加using Microsoft.Extensions.Logging;
-DharmaTurtle,

32

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

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

这样,您就可以仅记录来自System / Microsoft的错误,同时可以记录其他所有内容。


1
这为我做了工作。谢谢。
Sunny Okoro Awa,

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)
        {
        }
    }
}

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

可能的用法(以表示Startup.cs):

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

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

1
我在这里的任何地方都找不到正确的答案,正确的答案应该是: loggerFactory.WithFilter(new FilterLoggerSettings { { "Microsoft", LogLevel.Warning }, { "System", LogLevel.Warning }, { "MyOwnProject", LogLevel.Debug } }) .AddConsole(Configuration.GetSection("Logging")) .AddDebug();
timeshift

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;
}

但是,对于当前分支(尚未发布,但可通过每晚构建使用),该分支已被删除。现在,您需要通过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;
}

当然,除了传递委托以外,您还可以直接设置log4net的日志级别。

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

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

对于log4net,从示例中可以明显看出,可以按级别启用日志记录。对于上面喜欢的.NET Core记录器抽象,这是不可能的,因为该抽象不进行任何筛选。

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

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

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


这不是我所追求的。我不想在应用程序中全局更改日志记录级别,我只想关闭通过我的提供程序隧道传输的ASP.NET日志记录。我深入研究了源代码,这不是一件容易的事,我很不高兴:(
gdoron支持Monica

@gdoron:所有日志记录请求都将传输到每个已注册的ILoggingProvider。提供者/记录器的任务是执行日志级别过滤。这就是为什么MinimumLevel被删除,现在只能在每个供应商的水平设置

我了解所有记录器都应获取所有记录请求。我只是不明白为什么无法将ASP.NET本身的日志记录设置为特定级别,为什么我需要我的日志记录提供程序来了解所有组件,对我来说,这似乎是不好的设计。
gdoron支持莫妮卡

@gdoron:因为这是提供商的责任。一个应用程序可以有多个提供程序,在全局范围内设置它可能没有任何意义。例如,您可能要ConsoleLogger进行开发,希望拥有所有信息,包括“跟踪”和“调试”级别,另一方面,您可能希望具有仅记录错误和严重性的文件记录。因此,ASP.NET Core变得非常灵活,并且易于添加或删除某些功能。您所需要做的就是将记录器设置为“警告”级别或更高级别,然后将不会记录“调试”,“信息”和“跟踪”级别
Tseng

另外,您的记录器提供商不需要知道任何组件,只需了解调试级别即可,因为这可以告诉记录器应该记录哪种消息,哪些不应该。

2

仅为appsettings.json密钥设置Logging.LogLevelMicrosoft是不够的。我必须专门设置以下键,例如:

"Microsoft.Hosting.Lifetime": "Warning",
"Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
"Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware": "Warning"

但是作为替代方案,例如Microsoft.*,使用带有通配符的密钥是可行的。所以我最终得到了:

{
  "Logging": {
    "LogLevel": {
      "Default":     "Warning",
      "Microsoft.*": "Warning" 
  }
  ...
}

2

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

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

这对我没有用。ASP.NET核心仍在记录日志:'(
rdelgado-incinc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.