如何在不使用 Task.Delay 方法的情况下在 application insight 中创建日志?

How to make logs in application insight without using Task.Delay method?

using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp8
{
    class Program
    {
        static IServiceCollection services = new ServiceCollection()
        .AddLogging(loggingBuilder => loggingBuilder.AddFilter<Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider>("", LogLevel.Trace))
        .AddApplicationInsightsTelemetryWorkerService("Application_Key");

        static IServiceProvider serviceProvider = services.BuildServiceProvider();
        static ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();
        static TelemetryClient telemetryClient = serviceProvider.GetRequiredService<TelemetryClient>();
        static void Main(string[] args)
        {
            using (telemetryClient.StartOperation<RequestTelemetry>("AppointmentPatientCommunication"))
            {
                logger.LogInformation("1st");
                hero();
                logger.LogError("2nd");
                telemetryClient.TrackTrace("Here is the error");
                telemetryClient.Flush();

            }
        }
        static void hero()
        {
            using (telemetryClient.StartOperation<RequestTelemetry>("AppointmentPatientCommunication"))
            {
                logger.LogInformation("2nd");
                telemetryClient.Flush();

            }
        }
    }
}

我将此控制台应用程序上传为我的 webjob 以登录应用程序洞察力。我试图避免使用 task.delay() 以便我可以在完美的时间获得实时日志记录。我正在上传这个手动触发的网络作业,但我在应用程序洞察中看不到任何条目。谁能帮我解决这个问题?

感谢@Peter Bons的评论,问题已解决。

Telemetry Client中的Flush()方法用于刷新in-内存缓冲区 当应用程序关闭时。通常,SDK 每 30 秒 或当缓冲区已满(500 项)时发送数据,并且无需调用 Flush() 方法手动用于 Web 应用程序,除非程序已准备好关闭。

  • TelemetryClient 对象的 Flush() 方法将其当前保存在缓冲区中的所有数据发送到App Insights 服务。

  • Application Insights 将在 批量 传输您的数据背景更好地利用网络。

  • 在大多数情况下,您不需要调用 Flush()。但是,如果您知道该进程将在该点之后离开,您应该执行 Flush() 以确保所有 数据都被传输.

在这里,我在 Flush 语句之后添加了 Thread.Sleep(); 调用。

 static void Main(string[] args)
            {
                using (telemetryClient.StartOperation<RequestTelemetry>("AppointmentPatientCommunication"))
                {
                    logger.LogInformation("1st");
                    hero();
                    logger.LogError("2nd");
                    telemetryClient.TrackTrace("Here is the error");
                      # Flush takes some times to memory buffer at the shutdown activity.
                    telemetryClient.Flush();
                    # By default Flush takes 30 Sec so you have to wait for 30 sec.
                    Thread.Sleep(5000);

                }
            }
            static void hero()
            {
                using (telemetryClient.StartOperation<RequestTelemetry>("AppointmentPatientCommunication"))
                {
                    logger.LogInformation("2nd");
                    # Flush takes some times to memory buffer at the shutdown activity.
                    telemetryClient.Flush();
                    # By default Flush takes 30 Sec so you have to wait for 30 sec.
                    Thread.Sleep(5000);

                }
            }

人工智能结果:

遥测数据不会立即发送。遥测项目由 ApplicationInsights SDK 进行批处理和发送。在调用 Track() 方法后立即退出的控制台应用程序中,除非在应用程序退出之前完成 Flush() 和 Sleep/Delay,否则可能不会发送遥测数据,如本文后面的完整示例所示。如果您使用 InMemoryChannel,则不需要睡眠。这里有一个关于睡眠需求的活跃问题:link.

所以有两种类型的通道:InMemoryChannel 和 ServerTelemetryChannel 有关这两个频道的更多详细信息,请单击此 link

在我处理这个问题的程序中,我使用了InMemoryChannel。在下面的代码中,我展示了一部分代码来展示我是如何将它添加到我的程序中的。

static IServiceCollection services = new ServiceCollection()
        .AddLogging(loggingBuilder => loggingBuilder.AddFilter<Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider>("", LogLevel.Trace))
        .AddSingleton(typeof(ITelemetryChannel), new InMemoryChannel())
        .AddApplicationInsightsTelemetryWorkerService("Application_Key");

我使用的Nuget包是Microsoft.ApplicationInsights.Channel