0

我有一个用 .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 中,我只得到第一个日志(“正在启动... ”),而没有其他日志(“正在执行”和“打印”)。

关于这里有什么问题或我错过了什么的任何想法?

4

1 回答 1

2

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

在应用程序结束之前刷新日志是您的责任。请参阅记录器的生命周期

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

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

    try
    {
        // ...
    }
    finally
    {
        Log.CloseAndFlush(); // <##<##<##<##<##<##
    }
}
于 2021-10-06T21:43:59.207 回答