Saya mengonfigurasi DI sebagai berikut di aplikasi Konsol .NET Core 3.1 saya:

services.AddSingleton<ITelemetryInitializer, TelemetryInitializer>();
services.AddApplicationInsightsTelemetryWorkerService(instrumentationKey);

Dalam appSettings.json saya memiliki:

"Serilog": {
  "Using": [
    "Serilog.Sinks.Console",
    "Serilog.Sinks.ApplicationInsights"
  ],
  "MinimumLevel": "Information",
  "WriteTo": [
    {
      "Name": "Console",
      "Args": {
        "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}",
        "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
      }
    },
    {
      "Name": "ApplicationInsights",
      "Args": {
        "restrictedToMinimumLevel": "Information",
        "InstrumentationKey": "...",
        "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights",
        "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}",
        "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
      }
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
}

Serilog dikonfigurasi sebagai berikut:

Host.CreateDefaultBuilder(args)
    .UseSerilog((hostingContext, loggerConfiguration) =>
        loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration)
    )
    .UseConsoleLifetime()
    .Build()
    .Run()

Kelas penginisialisasi saya:

public class TelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        telemetry.Context.Cloud.RoleName = "something-something";
    }
}

Namun metode Initialize tidak dipanggil saat saya masuk menggunakan ILogger. Jika saya menyelesaikan TelemetryClient secara langsung dan masuk menggunakan itu, Initialize dipanggil.

Apakah saya melewatkan beberapa konfigurasi untuk Serilog?

4
extremeandy 17 November 2020, 07:53

1 menjawab

Jawaban Terbaik

Tampaknya ini adalah kesalahan Serilog.Sinks.ApplicationInsights. Saat menginisialisasi sink dari config (referensi kode), ini membuat TelemetryClient baru yang menghasilkan TelemetryConfiguration aktif sebelum TelemetryInitializer yang terdaftar dapat dikaitkan dengannya.

Untuk menyuntikkan TelemetryInitilizer dengan konfigurasi Aktif, instance TelemetryClient harus dibuat satu kali sebelum Serilog menginisialisasi sink App Insights. Kalau tidak, akan terlambat untuk menghormatinya karena secara internal AddApplicationInsightsTelemetryWorkerService mendaftarkan TelemetryClient sebagai Singleton. Jadi di bawah ini adalah kode kerja saya yang hanya membuat penyelesaian dummy TelemetryClient sebelum menginisialisasi loggerConfiguration dari Serilog.

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddApplicationInsightsTelemetryWorkerService(instrumentationKey);
                    services.AddSingleton<ITelemetryInitializer, TelemetryInitializer>();
                    services.AddHostedService<Worker>();
                })
                .UseSerilog((hostingContext, serviceProvider, loggerConfiguration) => {
                    serviceProvider.GetRequiredService<TelemetryClient>(); // just a dummy resolve
                    loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration);
                })
                .UseConsoleLifetime();
    }

Opsi 2 adalah membuat TelemetryConverter khusus yang dapat memperbarui konteks yang diperlukan alih-alih menggunakan Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter. Itu akan menghilangkan ketergantungan pada penginisialisasi.

Opsi 3 adalah beralih ke penyiapan berbasis kode alih-alih konfigurasi yang memungkinkan Anda meneruskan instance TelemetryClient atau TelemetryConfiguration seperti https://github.com/serilog/serilog-sinks-applicationinsights#configuring. Tapi itu mungkin tidak sedeklaratif pendekatan berbasis konfigurasi.

4
krishg 17 November 2020, 16:48