发布时 Serilog 不记录 ASP.NET 核心
Serilog not logging when published ASP.NET core
我将 Serilog 配置为在具有 ASP.NET 核心(运行 核心)的 WebApi 上同时写入 MSSQL table 和文件(以尝试确定发生了什么。) 2.1).
我在 startup.cs
中添加 Serilog 日志记录如下;
public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var log = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.MSSqlServer(
DbGlobals.DevDatabase, "Logs", schemaName:DbGlobals.SchemaName)
.WriteTo.File("Logs\Serilog\log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
loggerFactory.AddSerilog(log);
其中 DbGlobals.DevDatbase
和 Dbglobals.SchemaName
是从配置中读取的字符串。
更新供参考,这些值是;
DbGlobals.Schema = "MySchema";
DbGlobals.DevDatabase = "Data Source=xx.xx.xx.xx;Initial Catalog=DevDatabase;Integrated Security=False;Persist Security Info=False;User ID=LOGIN;Password=PASSWORD;MultipleActiveResultSets=true;";
当 运行 在本地使用 IIS Express 并且在 debug
和 release
配置下,两个日志记录功能都可以正常工作。因此,例如在我的控制器中;
public class ReviewPublicController : Controller
{
private readonly IReviewService _service;
private readonly IMapper _mapper;
private readonly IMailService _mailService;
private readonly ILogger _logger;
public ReviewController(
IReviewService service,
ILogger<ReviewController> logger)
{
_service = service;
_logger = logger;
}
[HttpPost]
[ProducesResponseType(typeof(Review), 201)]
[Route("")]
public async Task<IActionResult> Post([FromBody]ReviewPostModel model)
{
_logger.LogDebug("Posting Review");
...
return Ok();
}
所以本地 "Posting Review" 被写入我的文件和 DbSchema。
但是,当我发布到我的服务器时,上面的 "Posting Review" 条目也没有写入。
两者似乎都在工作,因为正在从 EF 和路由等添加信息条目,但当我专门尝试编写条目时却没有?
谁能告诉我这可能是什么问题?
当前的 nuget 版本是;
Serilog 2.7.1
Serilog.AspNetCore 2.1.1
Serilog.Sinks.MSSqlServer 5.1.2
Serilog.Sinks.File 4.0.0
此外,我的 appsettings.json
;
中有以下内容
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Release": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
更新
如文档中所示:
Default Level - if no MinimumLevel is specified, then Information level events and higher will be processed.
基本上,您的配置似乎无效或被覆盖。参见:https://github.com/serilog/serilog/wiki/Configuration-Basics
LogDebug
在 Release
构建中默认禁用,这可能是您发布的内容。
请尝试
_logger.LogInformation("Posting Review");
对我来说,解决方案是从 appsettings.json
中删除 "restrictedToMinimumLevel": "Information"
。
它在 appsettings.Development.json
中完全相同,并且在开发环境中运行良好。
对于我来说,以上都配置好了。它在我的本地环境中记录数据库,因为它在开发环境中不起作用。问题是由于身份验证。我正在为限制 serilog 写入服务器的应用程序使用 azure ad 身份验证。所以,在我的 program.cs 文件中,我添加了以下设置。
Program.cs
var sqlSinkOptions = new MSSqlServerSinkOptions
{
TableName = "MyLogTableName",
UseAzureManagedIdentity = true, // This line
AzureServiceTokenProviderResource = "https://database.windows.net/" // This line
};
在那之后,我可以看到开发环境中也发生了日志记录。可能这对某些人有帮助。编码愉快!
我将 Serilog 配置为在具有 ASP.NET 核心(运行 核心)的 WebApi 上同时写入 MSSQL table 和文件(以尝试确定发生了什么。) 2.1).
我在 startup.cs
中添加 Serilog 日志记录如下;
public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var log = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.MSSqlServer(
DbGlobals.DevDatabase, "Logs", schemaName:DbGlobals.SchemaName)
.WriteTo.File("Logs\Serilog\log.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
loggerFactory.AddSerilog(log);
其中 DbGlobals.DevDatbase
和 Dbglobals.SchemaName
是从配置中读取的字符串。
更新供参考,这些值是;
DbGlobals.Schema = "MySchema";
DbGlobals.DevDatabase = "Data Source=xx.xx.xx.xx;Initial Catalog=DevDatabase;Integrated Security=False;Persist Security Info=False;User ID=LOGIN;Password=PASSWORD;MultipleActiveResultSets=true;";
当 运行 在本地使用 IIS Express 并且在 debug
和 release
配置下,两个日志记录功能都可以正常工作。因此,例如在我的控制器中;
public class ReviewPublicController : Controller
{
private readonly IReviewService _service;
private readonly IMapper _mapper;
private readonly IMailService _mailService;
private readonly ILogger _logger;
public ReviewController(
IReviewService service,
ILogger<ReviewController> logger)
{
_service = service;
_logger = logger;
}
[HttpPost]
[ProducesResponseType(typeof(Review), 201)]
[Route("")]
public async Task<IActionResult> Post([FromBody]ReviewPostModel model)
{
_logger.LogDebug("Posting Review");
...
return Ok();
}
所以本地 "Posting Review" 被写入我的文件和 DbSchema。
但是,当我发布到我的服务器时,上面的 "Posting Review" 条目也没有写入。
两者似乎都在工作,因为正在从 EF 和路由等添加信息条目,但当我专门尝试编写条目时却没有?
谁能告诉我这可能是什么问题?
当前的 nuget 版本是;
Serilog 2.7.1
Serilog.AspNetCore 2.1.1
Serilog.Sinks.MSSqlServer 5.1.2
Serilog.Sinks.File 4.0.0
此外,我的 appsettings.json
;
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Release": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
更新
如文档中所示:
Default Level - if no MinimumLevel is specified, then Information level events and higher will be processed.
基本上,您的配置似乎无效或被覆盖。参见:https://github.com/serilog/serilog/wiki/Configuration-Basics
LogDebug
在 Release
构建中默认禁用,这可能是您发布的内容。
请尝试
_logger.LogInformation("Posting Review");
对我来说,解决方案是从 appsettings.json
中删除 "restrictedToMinimumLevel": "Information"
。
它在 appsettings.Development.json
中完全相同,并且在开发环境中运行良好。
对于我来说,以上都配置好了。它在我的本地环境中记录数据库,因为它在开发环境中不起作用。问题是由于身份验证。我正在为限制 serilog 写入服务器的应用程序使用 azure ad 身份验证。所以,在我的 program.cs 文件中,我添加了以下设置。
Program.cs
var sqlSinkOptions = new MSSqlServerSinkOptions
{
TableName = "MyLogTableName",
UseAzureManagedIdentity = true, // This line
AzureServiceTokenProviderResource = "https://database.windows.net/" // This line
};
在那之后,我可以看到开发环境中也发生了日志记录。可能这对某些人有帮助。编码愉快!