C# 如何在c中登录到控制台#

C# 如何在c中登录到控制台#,c#,logging,.net-core,console,console-application,C#,Logging,.net Core,Console,Console Application,我想使用Microsoft.Extensions.Logging将内容记录到控制台。我将其设置为: static void Main() { ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()); ILogger logger = loggerFactory.CreateLogger<Program>(); logger.LogInform

我想使用Microsoft.Extensions.Logging将内容记录到控制台。我将其设置为:

static void Main()
{
    ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
    ILogger logger = loggerFactory.CreateLogger<Program>();
    logger.LogInformation("Current directory {0}", Directory.GetCurrentDirectory());
}
static void Main()
{
ILoggerFactory=loggerFactory.Create(builder=>builder.AddConsole());
ILogger logger=loggerFactory.CreateLogger();
logger.LogInformation(“当前目录{0}”,directory.GetCurrentDirectory());
}

但是,没有向控制台写入任何内容。

问题在于,由
AddConsole
添加到
日志工厂的
ConsoleLoggerProvider
IDisposable
,必须将其处理,以便刷新输出。处理日志工厂将实现这一点。因此,在程序末尾调用
loggerFactory.Dispose()
,或者在创建loggerFactory时使用
添加
,如下所示:

static void Main()
{
    using ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
    ILogger logger = loggerFactory.CreateLogger<Program>();
    logger.LogInformation("Current directory {0}", Directory.GetCurrentDirectory());
}
static void Main()
{
使用ILoggerFactory loggerFactory=loggerFactory.Create(builder=>builder.AddConsole());
ILogger logger=loggerFactory.CreateLogger();
logger.LogInformation(“当前目录{0}”,directory.GetCurrentDirectory());
}

我认为实现这一点最简单的方法(不使用GenericHost)是使用
ServiceCollection
独立版

public static void Main()
{
    var collection = new ServiceCollection();
    collection.AddLogging(b => {
        b.AddConsole();
        b.SetMinimumLevel(LogLevel.Information);
    });
    var sp = collection.BuildServiceProvider();

    using(var scope = sp.CreateScope())
    {
        var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>();
        logger.LogInformation("Current directory {0}", Directory.GetCurrentDirectory());
    }
}
publicstaticvoidmain()
{
var collection=newservicecolection();
collection.AddLogging(b=>{
b、 AddConsole();
b、 SetMinimumLevel(日志级别信息);
});
var sp=collection.BuildServiceProvider();
使用(var scope=sp.CreateScope())
{
var logger=scope.ServiceProvider.GetRequiredService();
logger.LogInformation(“当前目录{0}”,directory.GetCurrentDirectory());
}
}

刚刚发布了此问答,因为我花了很长时间才知道如何在不使用诸如
ServiceCollection
或ASP.NET通用主机等重型机械的情况下执行此操作。如果要向记录器发送更多数据,则无需进行处理。您需要刷新()。您正在写入流,windows不会连续将流写入文件。Windows使用计时器和大小将数据从流移动到文件。刷新将把数据从流移到文件。也许FLASH STDUT也会解决这个问题,但是根据这个问题,处理/某事/是正确的方法。只有在结束应用程序时才处理,而不是在中间。Yes dispose将在应用程序顺利终止时修复问题,但不会在应用程序崩溃时修复问题。崩溃时,您仍希望查看记录器数据,如果未处理,则会丢失。这就是使用
关键字来确保对象在异常情况下也被处理的要点。Edit:“using语句确保即使using块中发生异常也会调用Dispose。”感谢您的回答。我以前见过这个解决方案,但我觉得仅仅为了让日志正常工作就太繁琐了。我强烈认为每个包/模块都应该独立工作,而不需要有其他三个类和对象。正如我在下面自己的回答中所评论的那样,我特别想寻找一种方法来让日志工作起来,而不需要添加其他任何东西。也许这不应该是一个评论,而是问题的一部分。@Sunday是的,很好,我只是想在这里添加这个,以确保完整性,如果有人需要登录并且可以使用
servicecolection
。但是是的,你也是对的,这也是我的观点。尽管如此,这是它在net core中的工作方式:)再次感谢,显然你是对的,这个答案对许多(愿意)使用
ServiceCollection
的人也很有用,并且完全符合前面提到的问题。让我们拭目以待,看看哪一个问题得到的票数更多;)