如何使 .net core 3.1 控制台应用程序中的控制台记录器工作

9

我正在构建一个 .Net Core 3.1 控制台应用程序,希望使用内置的控制台日志记录功能。有很多关于 .net 日志记录的文章,但我找不到一个实际在控制台中写入日志的示例。

   namespace test
   {
      class Program
      {

        static void Main(string[] args)
        {
            var serviceProvider = new ServiceCollection()
                .AddLogging(config => config.ClearProviders().AddConsole().SetMinimumLevel(LogLevel.Trace))
                .BuildServiceProvider();

            //configure console logging
            serviceProvider
                .GetService<ILoggerFactory>();


            var logger = serviceProvider.GetService<ILoggerFactory>()
                .CreateLogger<Program>();

            logger.LogDebug("All done!");

            Console.Write("Yup");
        }
    }

它可以编译和运行,甚至在控制台写入了“Yup”,但是“全部完成!”未显示。 控制台窗口输出:console-output 这是我的示例项目结构: enter image description here 我错过了什么吗?
这是服务的dispose:修复感谢Jeremy Lakeman:
            static void Main(string[] args)
        {
            using (var serviceProvider = new ServiceCollection()
                .AddLogging(config => config.ClearProviders().AddConsole().SetMinimumLevel(LogLevel.Trace))
                .BuildServiceProvider())
            {
                //configure console logging
                serviceProvider
                    .GetService<ILoggerFactory>();


                var logger = serviceProvider.GetService<ILoggerFactory>()
                    .CreateLogger<Program>();

                // run app logic

                logger.LogDebug("All done!");
            }

            Console.Write("Yup");
        }

@JeremyLakeman 哪些项目应该被处理?我在3.1日志示例中没有看到任何内容,2.x版本文档中有一些使用情况,但那甚至无法编译。 - k.c.
1
IServiceProvider 的实现应该是 IDisposable - Jeremy Lakeman
1
这个回答解决了你的问题吗? .Net Core控制台应用程序中的日志记录无法工作 - Karan
@Karan 不,它不会工作:".AddLogging(config => config.ClearProviders().AddConsole().SetMinimumLevel(LogLevel.Trace).AddDebug())"无法编译。你怎么让我的示例代码工作呢?你提到的那个问题可能是旧版本的Core? - k.c.
1
@JeremyLakeman 如果你添加一个简短的答案,我可以为你的解决方案提供适当的分数。 - k.c.
显示剩余6条评论
2个回答

5

如果有帮助的话,我想补充一些关于IT技术方面的内容。我之前也遇到过在.net Core中登录时出现了一些问题,并且在最新版本中不断有变化。但是,我并不抱怨,因为它们变得越来越好了。 以下是我在.net core 5版本中所做的。

public static class ApplicationLogging
{
    public static ILoggerFactory LogFactory { get; } = LoggerFactory.Create(builder =>
    {
        builder.ClearProviders();
        // Clear Microsoft's default providers (like eventlogs and others)
        builder.AddSimpleConsole(options =>
            {
                options.IncludeScopes = true;
                options.SingleLine = true;
                options.TimestampFormat = "hh:mm:ss ";
            }).SetMinimumLevel(LogLevel.Warning);
    });

    public static ILogger<T> CreateLogger<T>() => LogFactory.CreateLogger<T>();
}

static void Main(string[] args)
{
    var logger = ApplicationLogging.CreateLogger<Program>();
    logger.LogInformation("Let's do some work");
    logger.LogWarning("I am going Crazy now!!!");
    logger.LogInformation("Seems like we are finished our work!");
    Console.ReadLine();
}

3

为了避免日志记录对程序的性能产生负面影响,可以采用异步方式进行编写。

释放日志提供程序和其他日志记录类应该导致日志刷新。

服务提供程序在被释放时也应该释放所有服务。


那么,我如何使用在间隔上运行进程的控制台应用程序来实现这个?如果我处理了IServiceProvider,那么我的所有服务都会被处理,但我希望在控制台中获得实时更新。 - jasonxz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接