ASP.NET CORE 3.1 Worker Service Application.
Packages
"Microsoft.EntityFrameworkCore.Design" Version="3.1.3"
PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.3"
PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="3.1.3"
PackageReference Include="Serilog.AspNetCore" Version="3.2.0"
PackageReference Include="Serilog.Extensions.Hosting" Version="3.0.0"
Serilog 使用硬编码的 LoggerConfiguration 写入文件,但无法从从 appsettings.json 加载的 Config 工作
这是应用程序代码
public static class Program
{
public static IConfigurationRoot Configuration { get; set; }
private static string _environmentName;
public static void Main(string[] args)
{
var hostBuilder = CreateHostBuilder(args).Build();
//Log.Logger = (Configuration["Logging:LogLevel:Default"] == "Debug")?
// new LoggerConfiguration()
// .MinimumLevel.Debug()
// .WriteTo.Console()
// .WriteTo.File(path: Path.Combine("C:/LogFiles", "OA-EmailService-.log"),
// rollingInterval: RollingInterval.Day, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(10))
// .CreateLogger()
// :
// new LoggerConfiguration()
// .WriteTo.Console()
// .WriteTo.File(path: Path.Combine("C:/LogFiles", "OA-EmailService-.log"),
// rollingInterval: RollingInterval.Day, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(10))
// .CreateLogger()
// ;
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.CreateLogger();
try
{
Log.Information("APP:App started");
hostBuilder.Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "APP:App startup failed");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, config) =>
{
config.ClearProviders(); //Disabling default integrated logger
_environmentName = hostingContext.HostingEnvironment.EnvironmentName;
})
.ConfigureAppConfiguration((hostingContext, config) =>
{
Configuration = new ConfigurationBuilder()
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
//.AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json",
// optional: false,
// reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
})
.UseSerilog()
.UseWindowsService()
.ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); });
}
这里是 appsettings.json
{
"Serilog": {
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "===> {Timestamp:HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
}
},
{
"Name": "RollingFile",
"Args": {
"pathFormat": "C:/LogFiles/OA-EmailService-.log",
"outputTemplate": "===> {Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}"
}
}
]
}
}
有趣的是,Console sink 部分工作正常,只是文件有问题。如何强制 serilog 写入文件?
最佳答案
1) 您是否安装了正确的接收器包?您在 https://github.com/serilog/serilog-sinks-rollingfile 显示了(已弃用的)滚动文件接收器的参数。/https://www.nuget.org/packages/Serilog.Sinks.RollingFile/ ,必须主动安装才能运行 appsettings 值。
首选 Serilog.Sinks.File
包的语法如下:
"Serilog": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": ".\\yourpath\\yourfile.txt",
"rollingInterval": "Day"
}
}
]
}
2) 您指定的文件夹是否存在,可执行文件是否有权写入该文件夹?如果不允许尝试写入文件夹路径,它可能会静默失败由文件系统。
关于file - Serilog 不写入配置从 Console CORE 3 App 中的 appsettings.json 加载的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61902429/