旧版.NET Core Windows Service中App Insights与Serilog集成故障排查
.NET Core Windows Service 集成 Application Insights 日志排查与配置方案
一、保留Serilog与Application Insights集成的修正方案
清理冗余NuGet包:旧版.NET Core Worker Service(Windows Service基于此框架)无需
Microsoft.ApplicationInsights.AspNetCore,移除该包,仅保留Microsoft.ApplicationInsights.WorkerService和Serilog.Sinks.ApplicationInsights,避免包冲突导致日志发送失败。修正Program.cs初始化逻辑:确保Host正确关联Application Insights服务与Serilog,指定日志转换规则,示例代码:
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Sinks.ApplicationInsights.TelemetryConverters; var host = Host.CreateDefaultBuilder(args) .UseWindowsService() // 标记为Windows Service运行模式 .ConfigureServices(services => { // 注册Application Insights Worker服务 services.AddApplicationInsightsTelemetryWorkerService(); }) .UseSerilog((context, services, config) => config .ReadFrom.Configuration(context.Configuration) .ReadFrom.Services(services) // 将Serilog日志转为Application Insights可识别的TraceTelemetry .WriteTo.ApplicationInsights( services.GetRequiredService<Microsoft.ApplicationInsights.TelemetryClient>(), new TraceTelemetryConverter())) .Build(); await host.RunAsync();完善appsettings.json配置:添加Serilog日志级别配置,示例:
{ "ApplicationInsights": { "ConnectionString": "InstrumentationKey=<你的InstrumentationKey>;IngestionEndpoint=https://<你的区域>.applicationinsights.azure.com/" }, "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning" } } } }
二、放弃Serilog,仅使用Application Insights的配置方案
清理无关NuGet包:移除
Serilog.Sinks.ApplicationInsights和Microsoft.ApplicationInsights.AspNetCore,仅保留Microsoft.ApplicationInsights.WorkerService。简化Program.cs配置:直接使用.NET内置日志系统关联Application Insights,示例代码:
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; var host = Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureServices(services => { // 注册Application Insights Worker服务 services.AddApplicationInsightsTelemetryWorkerService(); // 注册你的Windows Service业务逻辑类 services.AddHostedService<YourWorkerService>(); }) .ConfigureLogging(logging => { // 清除默认日志提供器(可选,减少冗余日志) logging.ClearProviders(); // 添加Application Insights日志提供器 logging.AddApplicationInsights(); // 设置全局日志级别 logging.SetMinimumLevel(LogLevel.Information); }) .Build(); await host.RunAsync();在业务类中使用日志:通过依赖注入
ILogger<T>直接写入日志,示例:public class YourWorkerService : BackgroundService { private readonly ILogger<YourWorkerService> _logger; public YourWorkerService(ILogger<YourWorkerService> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("服务运行时间:{Time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } }
通用排查要点
- 验证ConnectionString有效性:确认
InstrumentationKey未使用占位符,IngestionEndpoint区域与你的Application Insights实例所在区域匹配。 - 检查服务运行权限:Windows Service的运行账户需具备访问Azure ingestion端点的网络权限,若在内网环境,需确保防火墙允许出站请求到对应地址。
- 查看本地事件日志:在Windows事件查看器中检查服务是否抛出初始化或日志发送相关的异常。
- 等待数据延迟:Application Insights数据存在5-10分钟的延迟,配置完成后需等待一段时间再到Azure门户的「日志」面板使用
traces查询日志。
内容的提问来源于stack exchange,提问作者Alex Gordon
相关产品推荐
相关产品推荐

