Asp.Net Core API 禁用启动完成消息

Posted

技术标签:

【中文标题】Asp.Net Core API 禁用启动完成消息【英文标题】:Asp.Net Core API disable startup complete message 【发布时间】:2017-05-25 14:07:11 【问题描述】:

作为我的应用程序的一部分,我有一个 .Net Core API 项目。与该项目作为自己的进程运行的大多数情况不同,我让 API 在一个线程中运行,除此之外,在单个进程中运行。同样对于我的项目,我已经实现了一个自定义日志系统来满足我的需求。但是,我遇到了一个小问题。每次我运行我的程序时,一旦 API 启动,此消息就会打印到控制台:

Hosting environment: Production
Content root path: C:\Users\Path\To\Code
Now listening on: http://*:8000
Application started. Press Ctrl+C to shut down.

我想禁用此消息,因为不需要它,并且它会使原本组织良好的控制台日志变得混乱。我在下面有一个屏幕截图,所以你知道我在说什么:

我已经禁用了 mvc 的所有其他日志记录(从 ConfigureServices 中删除了 ILoggerFactory 并在 appsettings.json 中将所有日志记录设置为“无”)。

如何禁用/禁止显示此消息?

【问题讨论】:

管道输出到 /dev/null 【参考方案1】:

.NET Core 3.x

好消息! ASP.NET Core 不再使用普通的Console 编写这些烦人的消息。现在使用抽象Logger,因此启动消息将由您的记录器以配置的格式写入,就像任何其他日志一样。

但是如果你想一直摆脱这些日志,你可以使用以下两种方法之一

第一种方法是在主机生成器上使用.ConfigureLogging(...) 方法从记录器中删除所有默认提供程序:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(loggingBuilder => 
        
            loggingBuilder.ClearProviders(); // <-- here
        )
        .ConfigureWebHostDefaults(webBuilder =>  webBuilder.UseStartup<Startup>(); );

另一种方法是在Startup.cs 中使用ConsoleLifetimeOptions 配置.NET Core 3 记录器:

public void ConfigureServices(IServiceCollection services)

    // ... 

    services.Configure<ConsoleLifetimeOptions>(opts => opts.SuppressStatusMessages = true);

    // ...

注意:第二种方法不会禁用有关在端口上侦听的应用程序的 Kestrel 日志(但首先会)

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://localhost:5000

.NET Core 2.x

可以通过 2 种方式禁用这些消息(除了已经提到的控制台设置):

1) 您可以使用环境变量禁用它们: "ASPNETCORE_SUPPRESSSTATUSMESSAGES": "true"

2) 或通过代码(Program.cs):

WebHost.CreateDefaultBuilder(args)
    .UseSetting(WebHostDefaults.SuppressStatusMessagesKey, "True") 

WebHost.CreateDefaultBuilder(args)
    .SuppressStatusMessages(true);

【讨论】:

【参考方案2】:

你也可以这样做:

var host = BuildWebHost(args);
host.Start();
host.WaitForShutdown();

这将绕过Console.WriteLine()s。

【讨论】:

刚刚测试过,它可以工作,不会使控制台无法使用。谢谢。【参考方案3】:

在 ASP.NET Core 2.1 中,对 WebHostBuilder 使用 SuppressStatusMessages 方法。

WebHost.CreateDefaultBuilder()
    .UseStartup<Startup>()
    .SuppressStatusMessages(true);

【讨论】:

【参考方案4】:

删除记录器工厂无济于事,因为它是 Console.WriteLine() (Ref : Github issue comment) 。您需要抑制 Console.WriteLine 输出。在 Main 方法中,编写如下代码。这将忽略 Console.WriteLine 输出。

public static void Main(string[] args)

    Console.SetOut(new StreamWriter(Stream.Null));
    BuildWebHost(args).Run();

【讨论】:

这不行。如果我这样做,那么控制台根本不会打印任何内容。这包括我的日志消息。有没有办法将此限制为 API?

以上是关于Asp.Net Core API 禁用启动完成消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 生产服务器上禁用“尝试重新连接到服务器”消息

如何禁用默认的 asp net core config change watcher?

ASP.NET Core Web API - JWT 消息处理程序 - 没有注册类型错误

如何继续等待 API 请求响应值完成 ASP .Net Core MVC

我如何在登录 asp.net core razor 之前显示加载图标或禁用按钮

ASP.NET Core Web API下事件驱动型架构的实现:一个简单的实现