【问题标题】:How to make console logger in .net core 3.1 console app work如何使 .net core 3.1 控制台应用程序中的控制台记录器工作
【发布时间】:2020-06-18 16:02:24
【问题描述】:

我正在构建一个 .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");
        }
    }

它编译并运行,甚至将“是的”写入控制台,但“全部完成!”未显示。 控制台窗口输出:

这是我的示例项目结构:

我错过了什么?

这是对服务的处置:感谢 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");
        }

【问题讨论】:

  • 无法重现问题,它会写入文本"Yup" 并生成日志条目“全部完成!”。
  • @Progman 感谢您的宝贵时间。我已经更新了这个问题,以便提供我的完整解决方案,如果你的工作有效,也许我们可以比较笔记。我是否需要添加其他配置或其他内容
  • IServiceProvider 的实现应该是 IDisposable
  • @JeremyLakeman 如果您添加一个简短的答案,我可以为您的解决方案提供适当的分数

标签: c# .net-core console-application


【解决方案1】:

我可能会迟到,但值得添加一些输入以防万一。我也在为登录 .net 核心而苦苦挣扎,并在最新版本中不断进行重大更改。但是,不能抱怨,因为它越来越好。 这是我对发布的 .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();
}

【讨论】:

    【解决方案2】:

    为了使日志记录不会对程序的性能产生不利影响,它可以异步编写。

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

    服务提供者也应该在处置时处置所有服务。

    【讨论】:

    • 那么....如何使用在间隔上运行进程的控制台应用程序执行此操作?如果我处置了 IServiceProvider,那么我的服务都会被处置,但我想在控制台中进行实时更新。
    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2020-07-09
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多