C# Asp.Net核心API禁用启动完成消息

C# Asp.Net核心API禁用启动完成消息,c#,asp.net-core,asp.net-core-mvc,.net-core,C#,Asp.net Core,Asp.net Core Mvc,.net Core,作为我应用程序的一部分,我有一个.Net核心API项目。与此项目作为自己的进程运行的大多数情况不同,我让API在一个线程中运行,以及在单个进程中运行。同样对于我的项目,我已经实现了一个定制的日志系统来满足我的需求。然而,我遇到了一个小问题。每次运行程序时,API启动后,此消息将打印到控制台: Hosting environment: Production Content root path: C:\Users\Path\To\Code Now listening on: http://*:800

作为我应用程序的一部分,我有一个.Net核心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中将所有日志记录设置为“无”)


如何禁用/抑制此消息?

删除记录器工厂没有帮助,因为它是Console.WriteLine()(参考:)。您需要抑制Console.WriteLine输出。在Main方法中,编写如下代码。这将忽略Console.WriteLine输出

public static void Main(string[] args)
{
    Console.SetOut(new StreamWriter(Stream.Null));
    BuildWebHost(args).Run();
}

您也可以这样做:

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

这将绕过ASP.NET Core 2.1中的
Console.WriteLine()
s.

,使用
WebHostBuilder上的方法

WebHost.CreateDefaultBuilder()
    .UseStartup<Startup>()
    .SuppressStatusMessages(true);
WebHost.CreateDefaultBuilder()
.UseStartup()
.SuppressStatusMessages(true);
.NET Core 3.x 好消息 ASP.NET核心不再使用普通的
控制台
编写这些恼人的消息。现在使用了abstract
Logger
,所以启动消息将由您的记录器以配置的格式编写,就像其他日志一样

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

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

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(loggingBuilder => 
        {
            loggingBuilder.ClearProviders(); // <-- here
        })
        .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
注意:第二种方法不会禁用Kestrel在端口上监听应用程序的日志(但第一种方法会)


.NETCore2.x 可以通过两种方式禁用这些消息(除了前面提到的控制台设置外):

1) 您可以使用环境变量禁用它们:
“ASPNETCORE\u SUPPRESSSTATUSMESSAGES”:“true”

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


通过管道将输出传输到/dev/null。这不行。如果我这样做,那么就根本不会向控制台打印任何内容。这包括我的日志消息。有没有办法将此限制在API中?刚刚测试过,它可以工作,而不会使控制台无法使用。谢谢
public void ConfigureServices(IServiceCollection services)
{
    // ... 

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

    // ...
}
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://localhost:5000
WebHost.CreateDefaultBuilder(args)
    .UseSetting(WebHostDefaults.SuppressStatusMessagesKey, "True") 
WebHost.CreateDefaultBuilder(args)
    .SuppressStatusMessages(true);