如何在不使用 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
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