我有一个 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 添加。谁能帮我解决这个问题。
你可以尝试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服务进程仍然在运行。
var retrievalSerivce = serviceBases.FirstOrDefault(x => x.ServiceName == "Retrieval");
retrievalSerivce.Stop();
ServiceBase.Run(retrievalSerivce);