如何为 Windows 服务启用 Application Insights?

问题描述 投票:0回答:1

我有一个 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 -

Microsoft.ApplicationInsights
,并且我确实拥有 AppInsight
InstrumentationKey
。我尝试在 Main 类中创建一个 Telemetry 并添加
InstrumentationKey
来配置它,但是 Nuget 中的所有 API 都与 ServiceCollection(对于 Web Api)相关,但无法为 ServiceBase 添加。谁能帮我解决这个问题。

c# windows-services azure-application-insights
1个回答
0
投票

你可以尝试Serilog。
安装nuget包

Serilog
Serilog.Sinks.ApplicationInsights

RetrievalService.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!");
        }
    }

LoggerService.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);

创建服务

sc create TestService binPath=D:\TESTS\ConsoleApp3\ConsoleApp3\bin\Release\net6.0\ConsoleApp3.exe

测试是否启动服务。

问题是当您停止服务进程时。它不会被记录。记录器需要一个主机。 Windows服务进程是一个主机,当服务进程(主机)打开时,记录器就可以工作。但是当服务进程(主机)终止时,没有代码可以工作。

只有当你停止在程序中时,它才会被记录,因为Windows服务进程仍然在运行。

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

© www.soinside.com 2019 - 2024. All rights reserved.