Serilog 在 asp.net 核心 2.2 API 中的配置不工作
Serilog not working from configuration in asp.net core 2.2 API
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
.UseStartup<Startup>();
}
public class Startup
{
public IContainer Container { get; private set; }
public Startup(IConfiguration configuration)
{
Log.Warning("test");
Configuration = configuration;
}
}
appsettings.json
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Default": "Information",
"Microsoft": "Information",
"System": "Information"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "C:\test.txt",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
"restrictedToMinimumLevel": "Information"
}
}
]
},
"AllowedHosts": "*"
}
我已经安装了所有的软件包
- Serilog,
- Serilog.AspCore,
- Serilog.Settings.Configuration、
- Serilog.Sink.File
您的配置适用于 RollingFile
,但您的软件包列表显示 Serilog.Sinks.File
。这些是不同的。您需要添加 Serilog.Sinks.RollingFile
包,它应该会开始工作。
如果你想使用 File
接收器(正如@Kirk 在评论中提到的,现在是推荐的选项)那么你需要将设置更改为
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\test.txt",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
"restrictedToMinimumLevel": "Information"
}
}
注意
对于 File
接收器
,pathFormat
应该是 path
问题似乎是直接写入 c: 而不是在配置中使用 File 这似乎不起作用,但写入不同的目录是可行的。
这是遇到此问题的任何人的最终解决方案
Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog();
}
Startup.cs
public Startup(IConfiguration configuration)
{
var logConfiguration = new LoggerConfiguration()
.ReadFrom.Configuration(configuration);
Log.Logger = logConfiguration.CreateLogger();
Configuration = configuration;
}
appsettings.json
"Serilog": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\temp\log.txt",
"rollingInterval": "Day"
}
}
]
}
这不是答案,而是观察。
我在这里观察到一个明确的问题。我有三个设置文件。
- appsettings.json,
- appsettings.Development.json,
- appsettings.VivekDev.json
我从launchSettings.json中选择了配置文件,因此环境是VivekDev,如下所示。
"ASPNETCORE_ENVIRONMENT": "VivekDev"
现在,当我在 appsettings.VivekDev.json 中进行以下设置而 appsettings.json 中没有任何 Serilog 设置时,那么一切正常。
"Serilog": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "log.txt",
"rollingInterval": "Day"
}
}
]
},
但是当我有
"Serilog": {
"WriteTo": [ "Debug" ]
},
在 appsettings.json 中,这以某种方式覆盖了 appsettings.VivekDev.json 中的设置。
根据我的理解,这是不正确的,appsettings.VivekDev.json 中的设置应该覆盖 appsettings.json.
这只发生在文件接收器的情况下。如果我使用其他接收器(例如控制台),那么一切都会按预期进行。那就是 appsettings.VivekDev.json 中的 serilog 设置正确地覆盖了 appsettings.json.
的 serilog 设置
这里肯定有问题。
所以现在,我已经删除了 appsettings.json 中的 serilog 设置,并保留了 [=61 中的 serilog 写入文件设置=]。
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
.UseStartup<Startup>();
}
public class Startup
{
public IContainer Container { get; private set; }
public Startup(IConfiguration configuration)
{
Log.Warning("test");
Configuration = configuration;
}
}
appsettings.json
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Default": "Information",
"Microsoft": "Information",
"System": "Information"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "C:\test.txt",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
"restrictedToMinimumLevel": "Information"
}
}
]
},
"AllowedHosts": "*"
}
我已经安装了所有的软件包
- Serilog,
- Serilog.AspCore,
- Serilog.Settings.Configuration、
- Serilog.Sink.File
您的配置适用于 RollingFile
,但您的软件包列表显示 Serilog.Sinks.File
。这些是不同的。您需要添加 Serilog.Sinks.RollingFile
包,它应该会开始工作。
如果你想使用 File
接收器(正如@Kirk 在评论中提到的,现在是推荐的选项)那么你需要将设置更改为
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\test.txt",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
"restrictedToMinimumLevel": "Information"
}
}
注意
对于 File
接收器
pathFormat
应该是 path
问题似乎是直接写入 c: 而不是在配置中使用 File 这似乎不起作用,但写入不同的目录是可行的。
这是遇到此问题的任何人的最终解决方案
Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog();
}
Startup.cs
public Startup(IConfiguration configuration)
{
var logConfiguration = new LoggerConfiguration()
.ReadFrom.Configuration(configuration);
Log.Logger = logConfiguration.CreateLogger();
Configuration = configuration;
}
appsettings.json
"Serilog": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "C:\temp\log.txt",
"rollingInterval": "Day"
}
}
]
}
这不是答案,而是观察。 我在这里观察到一个明确的问题。我有三个设置文件。
- appsettings.json,
- appsettings.Development.json,
- appsettings.VivekDev.json
我从launchSettings.json中选择了配置文件,因此环境是VivekDev,如下所示。
"ASPNETCORE_ENVIRONMENT": "VivekDev"
现在,当我在 appsettings.VivekDev.json 中进行以下设置而 appsettings.json 中没有任何 Serilog 设置时,那么一切正常。
"Serilog": {
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "log.txt",
"rollingInterval": "Day"
}
}
]
},
但是当我有
"Serilog": {
"WriteTo": [ "Debug" ]
},
在 appsettings.json 中,这以某种方式覆盖了 appsettings.VivekDev.json 中的设置。 根据我的理解,这是不正确的,appsettings.VivekDev.json 中的设置应该覆盖 appsettings.json.
这只发生在文件接收器的情况下。如果我使用其他接收器(例如控制台),那么一切都会按预期进行。那就是 appsettings.VivekDev.json 中的 serilog 设置正确地覆盖了 appsettings.json.
的 serilog 设置这里肯定有问题。
所以现在,我已经删除了 appsettings.json 中的 serilog 设置,并保留了 [=61 中的 serilog 写入文件设置=]。