首页 > 解决方案 > 为什么在 Serilog LoggerConfiguration() 中使用 .WriteTo.Debug?

问题描述

在我正在研究的项目中,记录器的初始化如下:

var logfile = String.Format($"logs/out_{Process.GetCurrentProcess().Id}_.log");
            var config = new LoggerConfiguration()
                //.Enrich.FromLogContext()
                .MinimumLevel.Debug()
                .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                .WriteTo.LoggerSink()
                .WriteTo.File(logfile, rollingInterval: RollingInterval.Minute)
                .WriteTo.Debug(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")
                .WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}");

            Log.Logger = config.CreateLogger();
            Log.Logger.Information("Startup()");

这会导致行重复,所以

Log.Logger.Information("Startup()");

结果是

[18:06:02 DBG] Startup()
[18:06:02 DBG] Startup()

出现在我的 VS Code 调试控制台中。

但仅在附加调试器时。

我发现问题可以通过删除线路来解决

.WriteTo.Debug(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}")

但这就是它的目的吗?

标签: c#.net

解决方案


没有重复。Debug是一个单独的通道,可以写入任何附加的调试器。如果没有附加的调试器,写入的任何内容Debug都会丢失。这样,如果没有人在听,就没有开销。Debug大多数 IDE在用于控制台输出的同一窗口中显示写入通道的任何内容。

当您在没有调试的情况下运行应用程序时,只有写入的消息Console才会出现在控制台中。如果您使用像DebugView这样的工具,您可以在附加调试器的情况下查看首次亮相的输出


推荐阅读