Serilog在发布ASP.NET Core时未记录日志

4

我已经配置了Serilog日志记录,可以将记录写入MSSQL表和文件中(以尝试确定发生了什么情况)。这是在运行Core 2.1的ASP.NET Core WebApi中完成的。

我按照以下方式在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.DevDatbaseDbglobals.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且在debugrelease配置下运行时,两个日志功能都能正常工作。例如,在我的控制器中:

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();
    }

当我在本地“发布评论”时,会同时将其写入我的文件和DbSchema。

然而,当我发布到服务器上时,“发布评论”条目不会被写入任何一个。

从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"
      }
    }

请分享 DbGlobals.DevDatabase - Derviş Kayımbaşıoğlu
你有Serilog的appsetting.json文件吗? - Stefan
好的,我已经更新了,虽然不确定它的相关性,但我可以确认它连接到了数据库。它也写入了文件,只是没有输出到我的日志记录中。 - Matthew Flynn
@Stefan 在 appsettings.json 中有默认的日志记录部分,但是(除非我错了),根据上面的内容它并没有考虑到这些部分?(一旦我确认了日志记录正常工作,这将是我的下一步)。我现在会添加它。 - Matthew Flynn
3个回答

5

更新

如文档所述:

默认级别 - 如果未指定最小级别,则将处理信息级别事件及更高级别的事件。

因此,基本上看起来您的配置无效或被覆盖了。请参阅:https://github.com/serilog/serilog/wiki/Configuration-Basics


LogDebugRelease 构建中默认处于禁用状态,这可能是您发布的情况。

请尝试使用以下内容:

_logger.LogInformation("Posting Review");

听起来很有前途,我现在会尝试一下。 - Matthew Flynn
可以确认,发布时LogInformationLogError都能正常工作。奇怪的是,在本地的发布版本中它们都能正常工作,而我认为LogDebug只是日志记录层次结构的一部分?你知道为什么会这样吗?(出于兴趣) - Matthew Flynn
很有趣,我一直认为这是由日志配置设置控制的。 - Matthew Flynn
嗯,你说得对,就像文档中所述:“默认级别 - 如果未指定最小级别,则将处理信息级别事件及更高级别的事件。”。因此,基本上,你的配置似乎无效或被覆盖了。请参见:https://github.com/serilog/serilog/wiki/Configuration-Basics - Stefan
是的,这些是我遵循的文档。这就是为什么我像你说的那样使用了.MinimumLevel.Verbose()。也许WebDeploy会引起变化? - Matthew Flynn

1
对我来说解决方案是从appsettings.json中删除"restrictedToMinimumLevel": "Information"。在appsettings.Development.json中也完全相同,在开发环境下运行良好。

0
对我来说,我已经配置了以上所有内容。它记录了我的本地环境中的数据库,但在开发环境中无法工作。问题是由于身份验证引起的。我正在为我的应用程序使用Azure AD身份验证,这限制了Serilog向服务器写入。因此,在我的program.cs文件中,我已添加了以下设置。

Program.cs

var sqlSinkOptions = new MSSqlServerSinkOptions
{
      TableName = "MyLogTableName",
      UseAzureManagedIdentity = true,  // This line
      AzureServiceTokenProviderResource = "https://database.windows.net/" // This line
};

之后,我可以看到日志记录也在开发环境中进行。希望这能帮助到某些人。编程愉快!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接