Asp.Net Core 2.0.1 的 Serilog 设置不生成日志
Serilog setup for Asp.Net Core 2.0.1 not producing logs
我正在尝试使用 Asp.Net Core 2.0.1、EF 2.0.1 和 MVC 6 在多项目解决方案中将 Serilog 设置为我的记录器。
我已经设置了 Serilog,主要是遵循此博客中的指南 post
Set up Serilog post
json 中的 post 有问题,我已更正并显示在此处
appsettings.json 文件
{
"ApplicationConfiguration": {
"ConnectionStrings": {
"DevelopmentConnection": "Server=(localdb)\mssqllocaldb;Database=TestingConfigurationNetCoreTwo_Development;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"ApplicationInfo": {
"VersionNumber": "1.0.0",
"Author": "Jimbo",
"ApplicationName": "CustomTemplate",
"CreatedOn": "November 20, 2017"
},
"Serilog": {
"Using": [
"Serilog.Sinks.RollingFile",
"Serilog.Sinks.Async",
"Serilog.Sinks.ApplicationInsights",
"Serilog.Sinks.Console",
"Serilog.Sinks.Seq"
],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning"
}
},
"WriteTo": [
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "RollingFile",
"Args": { "pathFormat": "Logs/log-{Date}.log" }
}
]
}
}
],
"Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"],
"Properties": {
"Application": "CustomTemplate"
}
}
}
}
我在 Program.cs
的 Main 方法中配置了记录器
public static int Main(string[] args)
{
var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{currentEnv}.json", optional: true)
.AddEnvironmentVariables()
.Build();
//Configure logger
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
//do this for now
//TODO:figure out how to add to Serilog config in appsettings.json
.WriteTo.Seq("http://localhost:5341")
.CreateLogger();
Log.Information("Logger created");
try
{
Log.Information("Starting web host");
BuildWebHost(args).Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Web Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
//BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
在我的启动方法中
services.AddLogging(loggingBuilder =>
loggingBuilder.AddSerilog(dispose: true));
我假设 Serilog 会在我 运行 应用程序后创建 Logs 文件夹,但没有 Log 文件夹或日志。我在解决方案的根目录和 Web 应用程序项目中添加了一个 Logs 文件夹,并再次 运行 它。没有日志。博客 post 作者建议查看计算机根文件夹。我查看了 C 和 OneDrive 主文件夹(存储在 OneDrive 上的解决方案文件),但那里也没有日志。
然后我注意到堆栈跟踪警告
System.IO.FileNotFoundException occurred
HResult=0x80070002
Message=The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\OneDrive\TestingConfigurationAspNetCore2\TestMvcApp\bin\Debug\netcoreapp2.0\appsettings.json'.
Source=
StackTrace:
at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()
at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
我之前收到过这个警告,这就是我在配置设置中添加 set bath path 方法的原因,因为应用程序在代码行失败
.AddJsonFile("appsettings.json")
这很明显,因为在 bin 文件夹中文件不叫 appsettings.json,而是叫 TestMvcApp.runtimeconfig.json。
添加 .SetBasePath 后,代码 运行 通过,因此我在配置设置后放置了一个断点。配置对象包含我的 appsettings.json 文件中的所有设置,那么为什么我会收到堆栈跟踪错误?我不知道,但我敢打赌这就是为什么没有日志(控制台中也没有日志消息出现)
如能提供有关堆栈跟踪错误的原因或没有日志消息写入日志文件或在控制台上显示的原因的任何帮助,我们将不胜感激。
which was fairly obvious because in the bin folder the file isn't
called appsettings.json, its called TestMvcApp.runtimeconfig.json.
TestMvcApp.runtimeconfig.json
不是你的 appsettings.json
,它是一个运行时配置文件,从文件名就可以看出来。
我打赌你的 appsettings.json
在构建过程中没有被复制到输出目录。要在 Visual Studio 解决方案资源管理器中修复 select appsettings.json
,请在上下文菜单 select 属性中将 'Copy to Output Directory' 设置为 'Copy always' 或 'Copy if newer' :
您的 json 配置也有几个问题:
Serilog
部分不应位于 ApplicationConfiguration
部分内。它应该在同一级别,即顶级部分。
- 您还有一个可疑的 WriteTo 部分,其中一个接收器 (
RollingFile
) 位于另一个接收器 (Async
) 中。在此处 sample json configuration 检查 Serilog。
- 为了使用所有这些接收器(
Serilog.Sinks.RollingFile
、Serilog.Sinks.Console
),您应该安装相应的接收器 NuGets:Serilog.Sinks.RollingFile, Serilog.Sinks.Console 等
这是适合我的配置文件(仅限 RollingFile sink):
{
"ApplicationConfiguration": {
"ConnectionStrings": {
"DevelopmentConnection": "Server=(localdb)\mssqllocaldb;Database=TestingConfigurationNetCoreTwo_Development;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"ApplicationInfo": {
"VersionNumber": "1.0.0",
"Author": "Jimbo",
"ApplicationName": "CustomTemplate",
"CreatedOn": "November 20, 2017"
}
},
"Serilog": {
"Using": [
"Serilog.Sinks.RollingFile"
],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": { "pathFormat": "c:\log-{Date}.log" }
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "CustomTemplate"
}
}
}
接受的答案只记录了我的项目的一些消息。我不确定为什么。 Ondrej Balas's approach 对我来说效果更好。
安装 这些 Nuget 包:
- Serilog
- Serilog.AspNetCore
- Serilog.Settings.Configuration
- Serilog.Sinks.Console
- Serilog.Sinks.RollingFile
Program.cs 需要 .UseSerilog()
添加:
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
})
.UseStartup<Startup>()
.UseSerilog()
.Build();
Startup.cs 需要一些更改
构造函数中的一个:
public Startup(IConfiguration configuration)
{
Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();
Configuration = configuration;
}
Configure()
中的另一个:
loggerFactory.AddSerilog();
if (env.IsDevelopment())
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
}
appsettings.json 需要 root:
中的 Serilog 配置条目
"Serilog": {
"Using": [ "Serilog.Sinks.Console" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{ "Name": "Console" },
{
"Name": "RollingFile",
"Args": {
"pathFormat": "logs\log-{Date}.log",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "My Application"
}
}
我正在尝试使用 Asp.Net Core 2.0.1、EF 2.0.1 和 MVC 6 在多项目解决方案中将 Serilog 设置为我的记录器。
我已经设置了 Serilog,主要是遵循此博客中的指南 post Set up Serilog post
json 中的 post 有问题,我已更正并显示在此处
appsettings.json 文件
{
"ApplicationConfiguration": {
"ConnectionStrings": {
"DevelopmentConnection": "Server=(localdb)\mssqllocaldb;Database=TestingConfigurationNetCoreTwo_Development;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"ApplicationInfo": {
"VersionNumber": "1.0.0",
"Author": "Jimbo",
"ApplicationName": "CustomTemplate",
"CreatedOn": "November 20, 2017"
},
"Serilog": {
"Using": [
"Serilog.Sinks.RollingFile",
"Serilog.Sinks.Async",
"Serilog.Sinks.ApplicationInsights",
"Serilog.Sinks.Console",
"Serilog.Sinks.Seq"
],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning"
}
},
"WriteTo": [
{
"Name": "Async",
"Args": {
"configure": [
{
"Name": "RollingFile",
"Args": { "pathFormat": "Logs/log-{Date}.log" }
}
]
}
}
],
"Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"],
"Properties": {
"Application": "CustomTemplate"
}
}
}
}
我在 Program.cs
的 Main 方法中配置了记录器public static int Main(string[] args)
{
var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{currentEnv}.json", optional: true)
.AddEnvironmentVariables()
.Build();
//Configure logger
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
//do this for now
//TODO:figure out how to add to Serilog config in appsettings.json
.WriteTo.Seq("http://localhost:5341")
.CreateLogger();
Log.Information("Logger created");
try
{
Log.Information("Starting web host");
BuildWebHost(args).Run();
return 0;
}
catch (Exception ex)
{
Log.Fatal(ex, "Web Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
}
//BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
在我的启动方法中
services.AddLogging(loggingBuilder =>
loggingBuilder.AddSerilog(dispose: true));
我假设 Serilog 会在我 运行 应用程序后创建 Logs 文件夹,但没有 Log 文件夹或日志。我在解决方案的根目录和 Web 应用程序项目中添加了一个 Logs 文件夹,并再次 运行 它。没有日志。博客 post 作者建议查看计算机根文件夹。我查看了 C 和 OneDrive 主文件夹(存储在 OneDrive 上的解决方案文件),但那里也没有日志。
然后我注意到堆栈跟踪警告
System.IO.FileNotFoundException occurred HResult=0x80070002 Message=The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Users\OneDrive\TestingConfigurationAspNetCore2\TestMvcApp\bin\Debug\netcoreapp2.0\appsettings.json'. Source= StackTrace: at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
我之前收到过这个警告,这就是我在配置设置中添加 set bath path 方法的原因,因为应用程序在代码行失败
.AddJsonFile("appsettings.json")
这很明显,因为在 bin 文件夹中文件不叫 appsettings.json,而是叫 TestMvcApp.runtimeconfig.json。
添加 .SetBasePath 后,代码 运行 通过,因此我在配置设置后放置了一个断点。配置对象包含我的 appsettings.json 文件中的所有设置,那么为什么我会收到堆栈跟踪错误?我不知道,但我敢打赌这就是为什么没有日志(控制台中也没有日志消息出现)
如能提供有关堆栈跟踪错误的原因或没有日志消息写入日志文件或在控制台上显示的原因的任何帮助,我们将不胜感激。
which was fairly obvious because in the bin folder the file isn't called appsettings.json, its called TestMvcApp.runtimeconfig.json.
TestMvcApp.runtimeconfig.json
不是你的 appsettings.json
,它是一个运行时配置文件,从文件名就可以看出来。
我打赌你的 appsettings.json
在构建过程中没有被复制到输出目录。要在 Visual Studio 解决方案资源管理器中修复 select appsettings.json
,请在上下文菜单 select 属性中将 'Copy to Output Directory' 设置为 'Copy always' 或 'Copy if newer' :
您的 json 配置也有几个问题:
Serilog
部分不应位于ApplicationConfiguration
部分内。它应该在同一级别,即顶级部分。- 您还有一个可疑的 WriteTo 部分,其中一个接收器 (
RollingFile
) 位于另一个接收器 (Async
) 中。在此处 sample json configuration 检查 Serilog。 - 为了使用所有这些接收器(
Serilog.Sinks.RollingFile
、Serilog.Sinks.Console
),您应该安装相应的接收器 NuGets:Serilog.Sinks.RollingFile, Serilog.Sinks.Console 等
这是适合我的配置文件(仅限 RollingFile sink):
{
"ApplicationConfiguration": {
"ConnectionStrings": {
"DevelopmentConnection": "Server=(localdb)\mssqllocaldb;Database=TestingConfigurationNetCoreTwo_Development;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"ApplicationInfo": {
"VersionNumber": "1.0.0",
"Author": "Jimbo",
"ApplicationName": "CustomTemplate",
"CreatedOn": "November 20, 2017"
}
},
"Serilog": {
"Using": [
"Serilog.Sinks.RollingFile"
],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": { "pathFormat": "c:\log-{Date}.log" }
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "CustomTemplate"
}
}
}
接受的答案只记录了我的项目的一些消息。我不确定为什么。 Ondrej Balas's approach 对我来说效果更好。
安装 这些 Nuget 包:
- Serilog
- Serilog.AspNetCore
- Serilog.Settings.Configuration
- Serilog.Sinks.Console
- Serilog.Sinks.RollingFile
Program.cs 需要 .UseSerilog()
添加:
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
})
.UseStartup<Startup>()
.UseSerilog()
.Build();
Startup.cs 需要一些更改
构造函数中的一个:
public Startup(IConfiguration configuration)
{
Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();
Configuration = configuration;
}
Configure()
中的另一个:
loggerFactory.AddSerilog();
if (env.IsDevelopment())
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
}
appsettings.json 需要 root:
中的 Serilog 配置条目"Serilog": {
"Using": [ "Serilog.Sinks.Console" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{ "Name": "Console" },
{
"Name": "RollingFile",
"Args": {
"pathFormat": "logs\log-{Date}.log",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] [{SourceContext}] {Message}{NewLine}{Exception}"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "My Application"
}
}