尝试在 Blazor 中使用 serilog-sinks-azureblobstorage

Dav*_*len 5 serilog blazor blazor-server-side serilog-aspnetcore serilog-sinks-azureblobstorage

更新: 我这里有一个非常简单的例子。既不工作File也不AzureBlobStorage工作。此外,如果AzureBlobStorage设置了,它会在尝试加载时遇到异常Blazor_Logger_bug.styles.css- 这解释了为什么启用此功能时页面无法呈现。

我已经转而编写自己的记录器(比我尝试使用 Serilog 花费的时间更少)。但想警告其他人,它似乎不起作用,并会在您的应用程序中导致不相关的问题。


我在 Blazor 服务器应用程序中使用此功能(Serilog 到文件接收器工作正常)时遇到各种问题。

如果我设置如下:

var _logger = new LoggerConfiguration()
    .ReadFrom.Configuration(config)
    .CreateLogger();
Log.Logger = _logger;
builder.Logging.AddSerilog(Log.Logger);
Run Code Online (Sandbox Code Playgroud)

然后它会成功记录到 Azure BLOB。但我有以下问题:

  1. 应用程序的页面显示空白。页面源是 _Host.cshtml,没有两个 <component> 节点(这就是一切)。

如果我设置如下:

builder.Logging.AddSerilog();
Run Code Online (Sandbox Code Playgroud)

然后网页就可以正常显示了。但我有以下问题:

  1. Azure BLOB 中未记录任何内容。

如果我将其设置如下:

builder.Host.UseSerilog((hostingContext, loggerConfiguration) =>
{
    loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration);
});
Run Code Online (Sandbox Code Playgroud)

然后网页就可以正常显示了。

但我有以下两个问题:

  1. Azure BLOB 中未记录任何内容。
  2. 控制台和调试日志记录没有任何内容。我认为是因为这取代了当时设置的日志记录。

完整的相关代码是:

if (builder.Environment.IsDevelopment())
{
    builder.Logging.ClearProviders();
    builder.Logging.AddJsonConsole();
    builder.Logging.AddDebug();
}
builder.Logging.AddSerilog();
Run Code Online (Sandbox Code Playgroud)

相关配置是:

"Serilog": {
    "Using": [ "Serilog.Sinks.File", "Serilog.Sinks.AzureBlobStorage" ],
    "MinimumLevel": {
        "Default": "Warning",
        "Override": {
            "LouisHowe": "Information",
            "ThirdPartyServices": "Information",
            "CommonUtilities": "Information",
            "Microsoft": "Warning"
        }
    },
    "WriteTo": [
        {
            "Name": "AzureBlobStorage",
            "Args": {
                "connectionString": "*****secret*****",
                "storageContainerName": "logs",
                "storageFileName": "{yyyy}-{MM}-{dd}.txt"
            }
        },
        {
            "Name": "File",
            "Args": {
                "path": "C:/temp/log-.txt",
                "rollOnFileSizeLimit": true,
                "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter,Serilog.Formatting.Compact",
                "rollingInterval": "Day"
            }
        }
    ],
    "Enrich": [ "FromLogContext", "WithThreadId", "WithMachineName" ]
},
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它发挥作用?


更新:重复一遍,我还配置了 Serilog 文件接收器并且工作正常。

我添加了Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));代码:

builder.Host.UseSerilog((hostingContext, loggerConfiguration) =>
{
    loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration);
});
Run Code Online (Sandbox Code Playgroud)

或者

var _logger = new LoggerConfiguration()
    .ReadFrom.Configuration(config)
    .CreateLogger();
Log.Logger = _logger;
builder.Logging.AddSerilog(Log.Logger);
Run Code Online (Sandbox Code Playgroud)

我在输出中得到了以下内容。未创建 BLOB。网页不显示。

2023-10-09T23:06:38.5791924Z Unable to find a method called WithThreadId. Candidate methods are:
Serilog.LoggerConfiguration With(Serilog.Configuration.LoggerEnrichmentConfiguration, Serilog.Core.ILogEventEnricher)
Serilog.LoggerConfiguration AtLevel(Serilog.Configuration.LoggerEnrichmentConfiguration, System.Action`1[Serilog.Configuration.LoggerEnrichmentConfiguration], Serilog.Events.LogEventLevel, Serilog.Core.LoggingLevelSwitch)
Serilog.LoggerConfiguration FromLogContext(Serilog.Configuration.LoggerEnrichmentConfiguration)
2023-10-09T23:06:38.5807420Z Unable to find a method called WithMachineName. Candidate methods are:
Serilog.LoggerConfiguration With(Serilog.Configuration.LoggerEnrichmentConfiguration, Serilog.Core.ILogEventEnricher)
Serilog.LoggerConfiguration AtLevel(Serilog.Configuration.LoggerEnrichmentConfiguration, System.Action`1[Serilog.Configuration.LoggerEnrichmentConfiguration], Serilog.Events.LogEventLevel, Serilog.Core.LoggingLevelSwitch)
Serilog.LoggerConfiguration FromLogContext(Serilog.Configuration.LoggerEnrichmentConfiguration)
Run Code Online (Sandbox Code Playgroud)

如果我使用builder.Logging.AddSerilog();,则不会有带有单词 的输出消息Serilog,不会创建 BLOB,并且网站会出现。