Serilog seems to be ignoring log level when deployed

1k Views Asked by At

We have serilog enabled for our .net6 web apps, and deployed within Azure App Services, to log to Elastic

Locally, the log levels appear to be adhered to, but when we deploy to Azure, it just seems to be ignored and log Information and Debug messages, and not use the min log level that was actually set.

The Program.cs is as so:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using System;
using System.IO;
using System.Threading.Tasks;

namespace MyApp
{
    public class Program
    {
        public async static Task<int> Main(string[] args)
        {
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .AddEnvironmentVariables()
                .Build();

            Serilog.Debugging.SelfLog.Enable(message => Console.WriteLine(message));

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

            try
            {
                Log.Information("Starting");
                await CreateHostBuilder(args).Build().RunAsync();
                return 0;
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, $"host terminated unexpectedly {ex}");
                return 1;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
                 Host.CreateDefaultBuilder(args)
                 .ConfigureWebHostDefaults(webBuilder =>
                 {
                     webBuilder.UseStartup<Startup>();
                 })
                 .UseSerilog();
    }
}

And the Serilog section with AppSettings.json

"Serilog": {
    "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.Elasticsearch"],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
          "outputTemplate": "[{Timestamp} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
        }
      },
      {
        "Name": "Elasticsearch",
        "Args": {
          "nodeUris": "https://<<<ELASTICHOST>>>",
          "indexFormat": "logs-{0:yyyy.MM.dd}",
          "connectionGlobalHeaders": "Authorization=ApiKey <<<KEY>>>>;",
          "emitEventFailure": "WriteToSelfLog",
          "autoRegisterTemplate": true,
          "registerTemplateFailure": "IndexAnyway",
          "autoRegisterTemplateVersion": "ESv7",
          "batchPostingLimit": 50,
          "batchAction": "Create",
          "period": 2,
          "inlineFields": true,
          "deadLetterIndexName": "deadletter-{0:yyyy.MM.dd}"
        }
      }
    ],
    "Enrich": ["FromLogContext"],
    "Properties": {
      "Application": "MyAzureAppServiceApp",
      "Environment": "Live"
    }
  }

The settings in the specific app service are as so:

Serilog__MinimumLevel__Default = Warning
Serilog__MinimumLevel__Override__Microsoft = Warning
Serilog__MinimumLevel__Override__System = Warning

enter image description here

1

There are 1 best solutions below

4
On

I assume that by

it just seems to be ignored

you mean that you cannot see it in Application Insigths logs correct?

In order to see logs in Application Insigths logs you have to use Serilog.Sinks.ApplicationInsights.

var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .AddEnvironmentVariables()
                .WriteTo.ApplicationInsights("InstrumentationKeyHere", TelemetryConverter.Traces, restrictedToMinimumLevel: LogEventLevel.Error)
                .Build();

I modified your code and added one line. The added line tells Serilog to treat your log as Application Insigtht log traces.