WorkerService 无法在部署机器上记录消息
WorkerService unable to log messages on deployment machine
我正在用 C# 构建一个作为 Windows 服务运行的 WorkerService。测试时,我能够很好地看到日志消息,因为有一个控制台 window 显示信息或错误消息。当我部署时,没有控制台 window,因为这是一个没有 GUI 的服务。不过,我仍然想记录信息性消息和错误。现在我可以在事件查看器中看到显示服务启动和停止并显示任何错误的信息,但我希望有一个日志文件,我可以向其中添加更多详细信息。这是我的 BackgroundWorker 的样子。
public class WindowsBackgroundService : BackgroundService
{
private readonly ILogger<WindowsBackgroundService> logger;
public WindowsBackgroundService(ILogger<WindowsBackgroundService> logger)
{
this.logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
//Logic would go here.
logger.LogInformation($"New User {newCustomer.Firstname} {newCustomer.Lastname} Added");
}
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
这是我的Program.cs,以防有人好奇或与此有关。
var host = Host.CreateDefaultBuilder(args)
.UseWindowsService(options =>
{
options.ServiceName = "Customer Broker Service";
})
.ConfigureServices(services =>
{
services.AddHostedService<WindowsBackgroundService>();
})
.Build();
await host.RunAsync();
当我在部署机器上 运行 服务时尝试使用记录器时,它使服务崩溃,因为没有控制台 window 来显示日志。我想我在这里遗漏了一些非常简单的东西。
您可以尝试使用 Serilog,只需在您的项目和代码中包含 Serilog nuget 包即可:
var host = Host.CreateDefaultBuilder(args)
.UseSerilog()
.UseWindowsService(options =>
{
options.ServiceName = "Customer Broker Service";
})
.ConfigureServices((hostContext, services) =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.RollingFile(@"C:\logs\log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
services.AddHostedService<WindowsBackgroundService>();
})
.Build();
await host.RunAsync();
您需要确保路径“C:\logs”存在,或者在上面的代码中相应地更改路径。您的工作人员代码不需要任何更改。
我正在用 C# 构建一个作为 Windows 服务运行的 WorkerService。测试时,我能够很好地看到日志消息,因为有一个控制台 window 显示信息或错误消息。当我部署时,没有控制台 window,因为这是一个没有 GUI 的服务。不过,我仍然想记录信息性消息和错误。现在我可以在事件查看器中看到显示服务启动和停止并显示任何错误的信息,但我希望有一个日志文件,我可以向其中添加更多详细信息。这是我的 BackgroundWorker 的样子。
public class WindowsBackgroundService : BackgroundService
{
private readonly ILogger<WindowsBackgroundService> logger;
public WindowsBackgroundService(ILogger<WindowsBackgroundService> logger)
{
this.logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
//Logic would go here.
logger.LogInformation($"New User {newCustomer.Firstname} {newCustomer.Lastname} Added");
}
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
这是我的Program.cs,以防有人好奇或与此有关。
var host = Host.CreateDefaultBuilder(args)
.UseWindowsService(options =>
{
options.ServiceName = "Customer Broker Service";
})
.ConfigureServices(services =>
{
services.AddHostedService<WindowsBackgroundService>();
})
.Build();
await host.RunAsync();
当我在部署机器上 运行 服务时尝试使用记录器时,它使服务崩溃,因为没有控制台 window 来显示日志。我想我在这里遗漏了一些非常简单的东西。
您可以尝试使用 Serilog,只需在您的项目和代码中包含 Serilog nuget 包即可:
var host = Host.CreateDefaultBuilder(args)
.UseSerilog()
.UseWindowsService(options =>
{
options.ServiceName = "Customer Broker Service";
})
.ConfigureServices((hostContext, services) =>
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.RollingFile(@"C:\logs\log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
services.AddHostedService<WindowsBackgroundService>();
})
.Build();
await host.RunAsync();
您需要确保路径“C:\logs”存在,或者在上面的代码中相应地更改路径。您的工作人员代码不需要任何更改。