【问题标题】:Azure Function failing to initialise Serilog Sink when using appsettings.json使用 appsettings.json 时 Azure 函数无法初始化 Serilog Sink
【发布时间】:2019-03-06 13:05:36
【问题描述】:

我创建了一个简单的 Azure 函数,其意图是使用 Serililog 记录到 Azure Blob 存储。

当对 Serilog 接收器使用内联配置时,它工作得非常好,接收器被创建并且 Serilog 愉快地写入 Blob 存储。

这行得通:

Log.Logger = new LoggerConfiguration()
   .WriteTo.AzureBlobStorage(
           "STORAGEACCOUNT CONNECTION STRING", // <-- inline config
           LogEventLevel.Information,
           null,
           "{yyyy}/{MM}/{dd}/MyLogFile.txt")
   .CreateLogger();

问题是我想通过appsettings.json 配置这一切,但是当我尝试这个(在模拟器和云中本地运行)时,它无法绑定接收器设置,因此它的无法登录到博客存储。

如果我进行调试,我可以看到配置值正按预期加载到 configuration 对象中,但它们没有应用于日志配置.

这不起作用:

Log.Logger = new LoggerConfiguration()
   .ReadFrom.Configuration(configuration)
   .CreateLogger();

appsettings.json 在这个 sn-p 中:

{

  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Information"
      }
    },
    "WriteTo": [{
        "Name": "AzureBlobStorage",
        "Args": {
          "connectionString": " --- REPLACE WITH STORAGEACCOUNT BLOB CONNECTION STRING --- ",
          "formatter": "Serilog.Formatting.Compact.RenderedCompactJsonFormatter, Serilog.Formatting.Compact",
          "storageFileName": "{yyyy}/{MM}/{dd}/MyLogFile.txt",
          "retainedFileCountLimit": 31
        }
      }

    ],
    "Properties": {
      "Application": "int-test-logging",
      "Environment": "int"
    }
  }

}

我不确定我做错了什么,但我们将不胜感激。以下 github 存储库包含实现上述(两种方法)的代码,并重现了此行为。 https://github.com/oneiltomlinson/AzureFunctionsLogging

【问题讨论】:

    标签: azure azure-functions serilog


    【解决方案1】:

    只需添加

        "Using": [ "Serilog.Sinks.AzureBlobStorage" ] //under Serilog Config
    

    它会起作用的!

    工作配置

    {
        "Serilog": {
            "Using": [
                "Serilog.Sinks.AzureBlobStorage"
            ],
            "MinimumLevel": {
                "Default": "Information",
                "Override": {
                    "Microsoft": "Information"
                }
            },
            "WriteTo": [
                {
                    "Name": "AzureBlobStorage",
                    "Args": {
                        "connectionString": " --- REPLACE WITH STORAGEACCOUNT BLOB CONNECTION STRING --- ",
                        "formatter": "Serilog.Formatting.Compact.RenderedCompactJsonFormatter, Serilog.Formatting.Compact",
                        "storageFileName": "{yyyy}/{MM}/{dd}/MyLogFile.txt",
                        "retainedFileCountLimit": 31
                    }
                }
            ],
            "Properties": {
                "Application": "int-test-logging",
                "Environment": "int"
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题,即使使用了所有必需的“使用”水槽,也没有任何改变。这是我的配置文件(关于 Serilog 部分):

            "Serilog": {
          "Using": [
            "Serilog.Sinks.RollingFile",
            "Serilog.Sinks.AzureTableStorage"
          ],
          "MinimumLevel": "Information",
          "Override": {
            "Microsoft": "Warning",
            "Microsoft.EntityFrameworkCore": "Information"
          },
          "WriteTo": [
            {
              "Name": "Logger",
              "Args": {
                "configureLogger": {
                  "MinimumLevel": "Information",
                  "WriteTo": [
                    {
                      "Name": "Console",
                      "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level:u3}] [TID:{ThreadId}] - {Message:lj}{NewLine}{Exception}"
                    },
                    {
                      "Name": "Debug",
                      "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level:u3}] [TID:{ThreadId}] - {Message:lj}{NewLine}{Exception}"
                    },
                    {
                      "Name": "AzureTableStorage",
                      "Args": {
                        "storageTableName": "HeroFunctionsLogs",
                        "connectionString": "DefaultEndpointsProtocol=https;AccountName=herobugari;AccountKey=NYJcdoCg9mQxqbQaTUdIxOHYQGdcKAwMsuWwzDub29UweHR1c+wd6Sh3IDQNB+eCx3DAe/ccobxu67sJvqQB5g==",
                        "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level:u3}] [TID:{ThreadId}] - {Message:lj}{NewLine}{Exception}",
                        "restrictedToMinimumLevel": "Information",
                        "writeInBatches": true,
                        "batchPostingLimit": 100
                      }
                    },
                    {
                      "Name": "RollingFile",
                      "Args": {
                        "pathFormat": "logs\\Bulgari.Hero.Functions.log",
                        "retainedFileCountLimit": 10,
                        "buffered": true,
                        "flushToDiskInterval": 5,
                        "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level:u3}] [TID:{ThreadId}] - {Message:lj}{NewLine}{Exception}"
                      }
                    }
                  ],
                  "Filter": [
                    {
                      "Name": "ByExcludingOnly",
                      "Args": {
                        "expression": "SourceContext like '%Microsoft.EntityFrameworkCore%'"
                      }
                    }
                  ]
                }
              }
            }
          ]
        }
      

      这是读取并尝试使用它的 Startup.cs 代码:

          var config = new ConfigurationBuilder()
                  .SetBasePath(Environment.CurrentDirectory)
              .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
              .AddEnvironmentVariables().Build();
          // Registering Serilog provider
          logger = new LoggerConfiguration()
              //.WriteTo.Console()
              //.WriteTo.File("logs\\herofunctions.log", rollingInterval: RollingInterval.Day)
              .ReadFrom.Configuration(config)
              .CreateLogger();
          builder.Services.AddLogging(lb => lb.AddSerilog(logger));
      

      记录器对象没有在问题中注册的“接收器”。

      【讨论】:

      • 面临类似的问题。使用配置添加到 appsetting.json 没有帮助。你有什么突破吗
      【解决方案3】:

      我在这里通过在 local.settings.json 中添加条目解决了完全相同的问题。

      "Serilog:Using:0": "Serilog.Sinks.Console",
      "Serilog:MinimumLevel": "Information",
      "Serilog:Override:Microsoft": "Warning",
      "Serilog:Override:System": "Warning",
      "Serilog:WriteTo:Console:Name": "Console"
      

      然后在 StartUp.cs 中:

      var provider = builder.Services.BuildServiceProvider();
      var config = provider.GetRequiredService<IConfiguration>();
      Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(config).CreateLogger();
      

      然后是函数:

      public class TestFunction
      {
          private readonly ILogger _logger;
          public TestFunction()
          {
              _logger = Log.Logger;
          }
      
          [FunctionName("TestFunction")]
          public async Task<IActionResult> Run(
              [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req)
          {
              _logger.Information("Hello");
              return new OkResult();
          }
      }
      

      }

      我可以看到已注册的配置条目并记录了条目!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多