在 .Net Core 控制台应用程序中登录不起作用。

9

我正在按照这篇教程进行操作:https://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

我已经安装了相应的软件包,但日志没有在任何地方打印。

以下是我的代码:

  var serviceProvider = new ServiceCollection()
            .AddLogging()
            .AddTransient<IFoo, Foo>(s =>
            {
                return new Foo()})
            .BuildServiceProvider();

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

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

            logger.LogError("Starting application");

1
你添加了以下代码块吗? { "dependencies": { "Microsoft.Extensions.Logging": "1.0.0", "Microsoft.Extensions.Logging.Console": "1.0.0", "Microsoft.Extensions.DependencyInjection": "1.0.0" } } - mjwills
是的,否则项目甚至无法编译。 - Mrug
4个回答

24

原来控制台日志提供程序不像net-core-1.x版本那样立即将消息刷新到控制台。它似乎在不同的线程上运行。请参阅此网页了解更多信息:https://github.com/aspnet/Logging/issues/631

您可以在Main函数末尾添加。

serviceProvider.Dispose();

或者您可以添加.AddDebug()

            serviceProvider
            .GetService<ILoggerFactory>()
            .AddConsole(LogLevel.Debug)
            .AddDebug();

1
AddDebug在我的控制台应用程序中没有起作用,其中TargetFramework设置为<TargetFramework>netcoreapp2.1</TargetFramework>。我需要在using中包装serviceProvider(因此调用Dispose)。 - mslot

3
创建一个新的ServiceProvider和HostBuilder可能不值得,如果我们只是想在控制台应用程序中记录日志,因为这需要额外的注意来清理或处理它。 相反,我建议使用Logging Factory来使用日志记录器,如果这就是我们想要的话,那么这将解决日志记录的问题。
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 ";
        });
        builder.AddApplicationInsights("instrument-key");
    });
    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();
}

1
我在尝试解决控制台日志记录不起作用的问题时,发现了这个帖子,并记录了我找到的答案。 使用的包: Microsoft.Extensions.Logging Microsoft.Extensions.Logging.Console Microsoft.Extensions.Logging.Debug
应用程序: .NET Core 2.2控制台(Microsoft.NET.Sdk,netcoreapp2.2) 使用Microsoft.Extensions.Hosting.IHost,这是我添加控制台日志记录的方法:
var hostBuilder = new HostBuilder()
                // Other Configuration omitted for brevity
                .ConfigureLogging((hostBuilderContext, loggingBuilder) =>
                {
                    loggingBuilder.AddConfiguration(hostBuilderContext.Configuration.GetSection("Logging"));
                    loggingBuilder.AddConsole(options =>
                    {
                        options.IncludeScopes = true;
                    });
                    loggingBuilder.AddDebug();
                });
// Start the application
await hostBuilder.RunConsoleAsync();

有趣的是,如果我在调用AddConsole时删除options参数,我就看不到任何日志记录。我认为这是因为我在我的代码中使用了ILogger来发出日志语句:
public class ClassThatLogs
{
    private readonly ILogger<ClassThatLogs> _logger;

    public ClassThatLogs(ILogger<ClassThatLogs> logger)
    {
        _logger = logger;
    }

    public void DoWork()
    {
        _logger.LogInformation("Working");
    }
}

0
如果我将控制台应用程序发布为单个文件,则 _log.LogDebug 不会输出任何内容。但是,如果我将其发布为非单个文件(只需取消选中单个文件选项),则 _log.LogDebug 将在控制台上提供所有调试语句的输出。除了取消选中单个文件之外,没有其他更改。因此,只需取消选中“生成单个文件”,我的 _logging.LogDebug 就开始向控制台写入内容了。

enter image description here

看起来是这样的:https://github.com/serilog/serilog-settings-configuration/issues/244

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