如何为 Windows 服务启用 Application Insights?

How to enable Application Insights for a windows service?

提问人:Cherylaksh 提问时间:10/29/2023 最后编辑:Tiny WangCherylaksh 更新时间:10/31/2023 访问量:94

问:

我有一个 Windows 服务,其中是这样的 -Program.cs

 static class Program
    {
    static void Main()
            {
                var serviceBases = new ServiceBase[]
                {
                    new RetrievalService(), 
                };
                ServiceBase.Run(serviceBases);
            }
    }

该类如下:RetrievalService

public partial class RetrievalService: ServiceBase
    {
        
        public RetrievalService()
        {
            InitializeComponent();
        }

        
        protected override void OnStart(string[] args)
        {
            
        }

        protected override void OnStop()
        {
            
        }
    }

我在项目中添加了 NugetPackage,并且我确实有 AppInsight 。我尝试在 Main 类中创建遥测并添加 来配置它,但 Nuget 中的所有 API 都与 ServiceCollection(用于 Web Api)相关,但无法为 ServiceBase 添加。谁能帮我解决这个问题。Microsoft.ApplicationInsightsInstrumentationKeyInstrumentationKey

C# ASP.net-core Windows-services azure-application-insights

评论

0赞 Anthony G. 10/30/2023
stackoverflow.com/questions/74435918/......这样就可以了。learn.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core 显示新的包设置和配置
0赞 Cherylaksh 10/30/2023
@AnthonyG。不。这不起作用,因为我的主程序有 ServiceBase 而不是 IServiceCollection,因此,我无法像这样配置日志记录 - 服务。AddLogging,如示例中所示
0赞 Anthony G. 10/31/2023
我认为您错过了使用 DI 配置和设置依赖项的意义。这些链接是作为一般指南提供的,而不是仅针对您的用例的复制和粘贴解决方案。从 ServiceBase 继承没有区别,您仍然需要配置和注入记录器或遥测客户端。几乎所有 Microsoft 的现代 Nuget 包都需要并记录使用良好的 IOC 原则。ServiceCollection 是 Web API 中使用的实现,而 IServiceProvider 将在控制台/服务代码中提供相同的功能。

答:

0赞 Qiang Fu 10/31/2023 #1

你可以试试Serilog。
安装 nuget 包
Serilog Serilog.Sinks.ApplicationInsights

检索服务.cs

    public partial class RetrievalService : ServiceBase
    {
        public RetrievalService()
        {
            ServiceName = "Retrieval";
        }

        protected override void OnStart(string[] args)
        {
            Log.Information("retrieval starting...");
        }
        protected override void OnStop()
        {
            Log.Fatal("retrieval stopped!");
        }
    }

记录器服务.cs

    public class LoggerService : ServiceBase
    {
        public LoggerService()
        {
            ServiceName = "Logger";

            var connectionString = "InstrumentationKey=xxxxx;IngestionEndpoint=xxx/;LiveEndpoint=hxx";
            Log.Logger = new LoggerConfiguration()
            .WriteTo.Console()
            .WriteTo.ApplicationInsights(connectionString, TelemetryConverter.Traces)
            .CreateLogger();
        }
    }

程序 .cs

var serviceBases = new ServiceBase[] {
    new RetrievalService(), 
    new LoggerService()
};
ServiceBase.Run(serviceBases);

创建服务
测试是否启动服务。
enter image description here
问题是当您停止服务进程时。它不会被记录下来。记录器以保持该过程的活力。但是当服务进程终止时,它将不起作用。
sc create TestService binPath=D:\TESTS\ConsoleApp3\ConsoleApp3\bin\Release\net6.0\ConsoleApp3.exe

只有当你在程序内部停止时,它才能被记录下来,因为Windows服务进程仍在运行。

var retrievalSerivce = serviceBases.FirstOrDefault(x => x.ServiceName == "Retrieval");
retrievalSerivce.Stop();
ServiceBase.Run(retrievalSerivce);

enter image description here