我们有一个 .NET 6.0 控制台应用程序,我们希望将其作为 Windows 服务运行,它可以工作,但不记录日志。如果我直接使用 Visual Studio 或 EXE 启动它,它就可以工作。我找到了一些关于如何配置 Serilog 的示例,但到目前为止没有任何效果。
public class Program
{
public static void Main(string[] args)
{
var builder = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(configuration =>
{
configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
})
.ConfigureServices(services =>
{
services.AddHostedService<WindowsBackgroundService>();
services.AddConnectionManagement();
services.AddSessionManagement();
services.AddTransient<IBLControllerFactory, BLControllerFactory>();
services.AddTransient<LoginHandler>();
services.AddHttpClient("123", (serviceProvider, client) =>
{
var config = serviceProvider.GetService<IConfiguration>();
client.Timeout = TimeSpan.FromMinutes(5);
client.DefaultRequestHeaders.Add("Origin", config.GetSection("123").GetValue<string>("OriginHeader"));
client.BaseAddress = new Uri(config.GetSection("123").GetValue<string>("ApiBaseAddress"));
}).AddHttpMessageHandler<LoginHandler>();
})
.UseWindowsService(lifetimeConfig =>
{
lifetimeConfig.ServiceName = "MES Server";
});
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true)
.CreateLogger();
var host = builder.Build();
host.Run();
}
}
public sealed class WindowsBackgroundService : BackgroundService
{
private readonly ILogger<WindowsBackgroundService> _logger;
public WindowsBackgroundService(ILogger<WindowsBackgroundService> logger)
{
_logger = logger;
}
public override async Task StartAsync(CancellationToken cancellationToken)
{
Log.Information("Start service");
}
}
logs/log.txt
是一个相对路径,它将解析为您的服务可能无权访问的目录。
指定绝对路径是正确的方法。 Windows 服务部署可能有点乏味 - 创建目标目录并确保您的服务用户帐户有权访问它需要成为部署过程的一部分。