Serilog 仅将来自 Main() 的消息记录到 .NET Framework 中的 Loggly

Serilog only logs messages from Main() into Loggly, in .NET Framework

我有一个用 .NET Framework 4.7.2 编写的应用程序,我们使用 Serilog 将消息记录到 Loggly。

我无法弄清楚的问题是它只记录来自 Main() 方法的消息,而不记录来自下面其他方法的消息(或者它可能只记录最开始的消息) .

即我有一个代码:

    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration().ReadFrom.AppSettings().Enrich.FromLogContext().WriteTo.Loggly(
            logglyConfig: new LogglyConfiguration
            {
                ApplicationName = ConfigurationManager.AppSettings["Loggly.ApplicationName"],
                CustomerToken = ConfigurationManager.AppSettings["Loggly.CustomerToken"],
                Tags = ConfigurationManager.AppSettings["Loggly.Tags"].Split(',').ToList(),
                EndpointHostName = "xxx.loggly.com",
                EndpointPort = 443,
                IsEnabled = true,
                LogTransport = TransportProtocol.Https,
                ThrowExceptions = false,
                OmitTimestamp = false
            }).CreateLogger();
        Log.Information($"[{nameof(Program)}] Starting...");
        
        Execute();
      }

      public static void Execute()
      {
        Log.Information($"Executing [{nameof(Program)}] ...");

        *... some processing code here ...*
        
        Print();
      }

      public static void Print()
      {
          Log.Information($"Printing Data");

          *... some printing code here ...*
      }

但在 Loggly 中,我只得到第一个日志(“Starting...”),以及 none 其他日志(正在执行”和“打印”)。

关于这里有什么问题或我遗漏了什么有什么想法吗?

像 Loggly 接收器这样的接收器在后台线程上发送消息。如果您的应用程序在后台线程能够发送消息之前结束,它们就会丢失,这很可能是您的情况...

您有责任在应用程序结束前刷新日志。参见 Lifecycle of Loggers

您可以通过调用 Log.CloseAndFlush() 或处理您的记录器来做到这一点。

public static void Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        // ...
        .CreateLogger();

    try
    {
        // ...
    }
    finally
    {
        Log.CloseAndFlush(); // <##<##<##<##<##<##
    }
}