在生产模式下删除 ASP.NET Core 2.0 中的控制台和调试记录器

     2023-04-12     117

关键词:

【中文标题】在生产模式下删除 ASP.NET Core 2.0 中的控制台和调试记录器【英文标题】:Remove console and debug loggers in ASP.NET Core 2.0 when in production mode 【发布时间】:2018-02-09 17:00:45 【问题描述】:

在 ASP.NET Core 2.0 中我们有这个

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();

CreateDefaultBuilder(args) 有许多有用的默认值。然而它contains this:

.ConfigureLogging((context, logging) => 
    logging.AddConfiguration(context.Configuration.GetSection("Logging"));
    logging.AddConsole();   // HERE IS THE PROBLEM
    logging.AddDebug();     // HERE IS THE PROBLEM
)

所以控制台和调试日志提供程序总是被注册。

我以前是这样注册的

if (env.IsDevelopment())
 
    // register them here

在生产模式下运行时如何删除/取消注册它们? 我的意思不是改变日志记录级别,我的意思是我根本不希望它们在生产模式下注册。

【问题讨论】:

CreateDefaultBuilder 的创建是为了简化新项目的设置(聚合许多常见的东西)。在最终 2.0 之前,没有 DefaultBuilder。我建议您从刚刚链接的源代码中复制代码并自行更改,正如我所说,CreateDefaultBuilder 只是为了简化这一步。看看之前是怎么做的:docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/…。问候。 @dime2lo 我希望我不必这样做。我对默认设置很满意,除了生产模式下的日志记录。肯定有一种方法可以撤消这些特定的注册。 【参考方案1】:

我会说设计的方法是通过更改日志配置而不向这些提供者记录任何内容。但我了解您想取消任何生产要求;而且您仍然可以在代码中正确执行此操作。

您可以简单地从传递给ConfigureLogging lambda 的HostBuilderContext 访问托管环境:

.ConfigureLogging((context, logging) =>

    logging.AddConfiguration(context.Configuration.GetSection("Logging"));

    if (context.HostingEnvironment.IsDevelopment())
    
        logging.AddConsole();
        logging.AddDebug();
    
);

显然,仅此一项并不能帮助撤消 CreateDefaultBuilder 调用已经设置的内容。首先,您需要注销这些提供程序。为此,您可以使用新的ILoggingBuilder.ClearProviders 方法:

.ConfigureLogging((context, logging) =>

    // clear all previously registered providers
    logging.ClearProviders();

    // now register everything you *really* want
    // …
);

这是为了回应this logging issue on GitHub而引入的。

【讨论】:

如果没有找到 ClearProviders 添加using namespace Microsoft.Extensions.Logging 遗憾的是,没有办法删除提供程序 - 只有创建全新配置的能力,尤其是现在 ASP.NET Core 的默认构建器创建了一个默认配置,其中包括调试和控制台记录器。要查看的位置在CreateDefaultBuilder() 的源代码中,并仅从那里复制您需要的内容。 我爱ClearProviders()!我想在调试期间禁用日志记录 - 因为我正在测试服务器往返(在 for 循环中 100 次)并且不希望有时间编写和滚动控制台来搞砸我的结果。看起来每个数据库调用仅用于日志记录大约需要 10 毫秒! 同样重要的是要注意(就像您所做的那样)ClearProviders 是官方批准的解决此问题的解决方案 - 而不仅仅是 hack :-)【参考方案2】:

我发现最好从服务中删除特定的日志记录提供程序,如下所示:

.ConfigureLogging((context, logging) => 
    foreach (ServiceDescriptor serviceDescriptor in logging.Services)
    
        if (serviceDescriptor.ImplementationType == typeof(Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider))
        
            // remove ConsoleLoggerProvider service only
            logging.Services.Remove(serviceDescriptor);
            break;
        
    

    // now you can register any new logging provider service; e.g.,
    logging.AddLog4Net();
    logging.AddEventSourceLogger();
)

【讨论】:

【参考方案3】:

我认为您可能无法使用 CreateDefaultBuilder 或将 LogLevels 设置为 None。根据文档,您可以使用它。

public static void Main(string[] args)

var webHost = new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .ConfigureAppConfiguration((hostingContext, config) =>
    
        var env = hostingContext.HostingEnvironment;
        config.AddJsonFile("appsettings.json", optional: true, 
reloadOnChange: true)
              .AddJsonFile($"appsettings.env.EnvironmentName.json", 
optional: true, reloadOnChange: true);
        config.AddEnvironmentVariables();
    )
    .ConfigureLogging((hostingContext, logging) =>
    


logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddConsole();
        logging.AddDebug();
    )
    .UseStartup<Startup>()
    .Build();

webHost.Run();

如何添加提供者 Section https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging?tabs=aspnetcore2x

找到另一个选项,只需在 appsettings.json 中为控制台添加一个日志过滤器

  "Logging": 
"IncludeScopes": false,
"LogLevel": 
  "Default": "Debug",
  "System": "Information",
  "Microsoft": "Information"
,
"Console": 
  "LogLevel": 
    "Default": "None"
  

,

【讨论】:

是的,我们在 1.1 中就是这样做的。我想保留默认值,但撤消这些注册,一定有办法。 我知道的唯一方法是用您自己的代码覆盖该类。我必须为 Identity PasswordHasher 这样做。 我可以单独通过配置添加日志提供程序吗?我无法完全弄清楚。 (我想 ClearProviders() 并通过 appsettings.json 添加控制台) @JensMander 我不相信这是可能的。如果可能,这将取决于您使用的提供商。

在使用 IdentityDbContext 的情况下,如何在 ASP.NET Core MVC 中使用存储库模式?

...IdentityDbContext的情况下,如何在ASP.NETCoreMVC中使用存储库模式?【英文标题】:HowtouserepositorypatterninASP.NETCoreMVCwhileIdentityDbContexthasbeenused?【发布时间】:2022-01-1000:32:29【问题描述】:我在我的项目中使用了IdentityDbContext。我的数据... 查看详情

如何在 ASP.NET Core 2.0 中根据路由配置服务身份验证

】如何在ASP.NETCore2.0中根据路由配置服务身份验证【英文标题】:HowtoConfigureServicesAuthenticationbasedonroutesinASP.NETCore2.0【发布时间】:2018-03-0922:06:40【问题描述】:在ASP.NETCore1.x中,我可以在Configure中使用身份验证方法,但现在在ASP... 查看详情

ASP.NET Core 托管环境变量被忽略

...适用于其中一个站点,但另一个站点忽略该变量并改为在生产模式下运 查看详情

asp.net core 2.0 授权在身份验证(JWT)之前触发

】asp.netcore2.0授权在身份验证(JWT)之前触发【英文标题】:asp.netcore2.0Authorizationisfiringbeforeauthentication(JWT)【发布时间】:2018-08-2917:53:24【问题描述】:我正在尝试在我的asp.netcore2.0应用程序中实施自定义授权策略。在我的自定... 查看详情

如何在 ASP.NET Core 2.0 中设置多个身份验证方案?

】如何在ASP.NETCore2.0中设置多个身份验证方案?【英文标题】:HowdoIsetupmultipleauthschemesinASP.NETCore2.0?【发布时间】:2018-01-2312:34:16【问题描述】:我正在尝试将我的身份验证内容迁移到Core2.0,但在使用我自己的身份验证方案时遇... 查看详情

如何在 ASP.NET Core 2.0 中预编译视图?

】如何在ASP.NETCore2.0中预编译视图?【英文标题】:HowtoprecompileviewsinASP.NETCore2.0?【发布时间】:2018-09-0919:29:48【问题描述】:我根据article设置了我的解决方案。我省略了一些内容,因为根据this,ASP.NETCore2.0默认预编译视图。最... 查看详情

Asp.Net Core 2.0 中的“HttpPostedFileBase”

】Asp.NetCore2.0中的“HttpPostedFileBase”【英文标题】:\'HttpPostedFileBase\'inAsp.NetCore2.0【发布时间】:2018-06-2510:22:12【问题描述】:我最近正在开发一个调用API(使用.NETCore2.0开发)的ReactJS应用程序。我的问题是如何在.NETCore2.0API中使... 查看详情

具有用户权限的基于 JWT 令牌的授权 Asp.net core 2.0

...问题描述】:我创建了一个JWT令牌,声明为读取或写入或删除权限,如下图所示。现在,管理员/普通用户都登录到系统。管理员和普通用户获取令牌并存储在本地存储中。普通用户第一次无法获得读/写/创建/删 查看详情

如何在 ASP.NET Core 3.1 生产中配置 IdentityServer

】如何在ASP.NETCore3.1生产中配置IdentityServer【英文标题】:HowtoconfigureIdentityServerinASP.NETCore3.1production【发布时间】:2021-10-2711:31:05【问题描述】:我正在尝试运行ASP.NETCore3.1应用程序,该应用程序在开发中运行良好,但在生产环境... 查看详情

ASP.Net Core 2.0 FileTable 使用

】ASP.NetCore2.0FileTable使用【英文标题】:ASP.NetCore2.0FileTableUsage【发布时间】:2018-06-2014:25:31【问题描述】:我有一个使用EntityFrameworkCore和SQLServer2012数据库的现有ASP.NetCore2.0项目。需要添加一个允许用户在创建新项目时上传文档... 查看详情

如何在 Asp.net core 2.0 中使用 log4net

】如何在Asp.netcore2.0中使用log4net【英文标题】:Howtouselog4netinAsp.netcore2.0【发布时间】:2018-02-2012:23:18【问题描述】:我在我的asp.netcore2.0应用程序中配置了log4net,如本文所述LINK程序.cspublicstaticvoidMain(string[]args)varlogRepository=LogMana... 查看详情

如何在 ASP.NET Core 2.0 Razor 页面中填充下拉列表

】如何在ASP.NETCore2.0Razor页面中填充下拉列表【英文标题】:HowtopopulatedropdownlistInASP.NETCore2.0Razorpage【发布时间】:2018-02-0702:23:31【问题描述】:我想从我的数据库中填充下拉列表。剃须刀页面中模型绑定的方式是什么publicIActionRe... 查看详情

Asp.net Core 2.0 Identity.TwoFactorRememberMe 到期

】Asp.netCore2.0Identity.TwoFactorRememberMe到期【英文标题】:Asp.netCore2.0Identity.TwoFactorRememberMeexpiry【发布时间】:2018-11-1016:49:04【问题描述】:我一直在寻找,但找不到更改Identity.TwoFactorRememberMecookie的到期日期的方法,该cookie在您调... 查看详情

如何在 asp.net core v 2.0 中从 javascript 调用 PageModel 方法

】如何在asp.netcorev2.0中从javascript调用PageModel方法【英文标题】:HowtocallPageModelMethodfromjavascriptinasp.netcorev2.0【发布时间】:2018-02-2810:42:07【问题描述】:我正在编写一个asp.net核心网站,显示在其他地方生成的图片。我正在其他地... 查看详情

如何在 Asp.Net Core 2.0“AddJwtBearer”中间件中设置多个受众?

】如何在Asp.NetCore2.0“AddJwtBearer”中间件中设置多个受众?【英文标题】:HowtosetmultipleaudiencesinAsp.NetCore2.0"AddJwtBearer"middleware?【发布时间】:2018-04-0923:20:04【问题描述】:我有一个针对AAD进行身份验证的Asp.NetCore2.0WebApi:s... 查看详情

在 asp.net core 2.0 中使用 angular 5 上传文件。文件为空

】在asp.netcore2.0中使用angular5上传文件。文件为空【英文标题】:FileUploadusingangular5inasp.netcore2.0.Fileisnull【发布时间】:2018-07-2118:05:02【问题描述】:我正在尝试在asp.netcore2.0中使用angular5上传文件。这是我的服务器端代码。publiccl... 查看详情

在 ASP.NET Core 2.0 Web Api 中返回“原始”json

】在ASP.NETCore2.0WebApi中返回“原始”json【英文标题】:Return"raw"jsoninASP.NETCore2.0WebApi【发布时间】:2018-01-1908:12:55【问题描述】:AFAIK在ASP.NETCoreWebApi中返回数据的标准方法是使用IActionResult并提供例如OkObject结果。这适用于... 查看详情

ASP.NET CORE 2.0 中的 FromUri

】ASP.NETCORE2.0中的FromUri【英文标题】:FromUriinASP.NETCORE2.0【发布时间】:2018-06-2001:41:53【问题描述】:这个问题是因为在我使用ASP.NETCORE2.0的MVC项目中,我无法将[FromUri]attribute添加到我的驱动程序中。我尝试使用像System.Web.Http这... 查看详情