.NET Analizler uygulama günlük kaydı

Bu makalede, çeşitli uygulama paketleri kullanarak .NET uygulamalarına Uygulama Analizler ile günlükleri yakalamayı NuGet öğrenirsiniz:

İpucu

NuGet Microsoft.ApplicationInsights.WorkerService paketi bu makalenin kapsamının dışındadır. Arka plan hizmetleri için Application Analizler etkinleştirmek için kullanılabilir. Daha fazla bilgi için, bkz. Application Analizler for Worker Service apps.

Kullandığınız Application Analizler günlük paketine bağlı olarak, kaydetmenin çeşitli yolları ApplicationInsightsLoggerProvider vardır. ApplicationInsightsLoggerProvider , ve ILoggerProvider sağlamadan sorumlu olan uygulamasının ILogger ILogger<TCategoryName> bir uygulamasıdır.

ASP.NET Core uygulamaları

Uygulama uygulamanıza Analizler telemetrisi ASP.NET Core için uygulama NuGet Microsoft.ApplicationInsights.AspNetCore kullanın. Bunu bağlı hizmet olarak Visual Studio veya el ileyapılandırabilirsiniz.

Varsayılan olarak, ASP.NET Core uygulamalar kod veya kodsuz yaklaşım Analizler yapılandırıldığında kayıtlı bir Application Analizler günlük sağlayıcısına sahiptir. Kayıtlı sağlayıcı, veya daha büyük önem derecesine sahip günlük olaylarını otomatik olarak LogLevel.Warning yakalayan şekilde yapılandırılır. Önem derecelerini ve kategorileri özelleştirebilirsiniz. Daha fazla bilgi için bkz. Günlük düzeyi.

  1. NuGet paketinin yüklü olduğundan emin olmak:

     <ItemGroup>
         <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.17.0" />
     </ItemGroup>
    
  2. yönteminin Startup.ConfigureServices çağırması services.AddApplicationInsightsTelemetry gerekir:

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Configuration;
    
    namespace WebApplication
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddApplicationInsightsTelemetry();
                // Configure the Connection String/Instrumentation key in appsettings.json
            }
    
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                // omitted for brevity
            }
        }
    }
    

Uygulama NuGet ve sağlayıcı bağımlılık ekleme ile kaydedilene kadar, uygulama günlüğe kaydedilebilir. Oluşturucu ekleme ile veya ILogger genel tür alternatif ILogger<TCategoryName> gereklidir. Bu uygulamalar çözümlendiklerde ApplicationInsightsLoggerProvider bunları sağlar. Günlüğe kaydedilen iletiler veya özel durumlar Application Analizler.

Aşağıdaki örnek denetleyiciyi düşünün:

public class ValuesController : ControllerBase
{
    private readonly ILogger _logger;

    public ValuesController(ILogger<ValuesController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        _logger.LogWarning("An example of a Warning trace..");
        _logger.LogError("An example of an Error level message");

        return new string[] { "value1", "value2" };
    }
}

Daha fazla bilgi için bkz. ASP.NET Core.

Başlangıç kodunda ASP.NET Core yakalama

Bazı senaryolar, istek-yanıt işlem hattının istekleri kabul etmeye hazır hale gelmeden önce uygulama başlatma yordamının bir parçası olarak günlükleri yakalamayı gerektirir. Ancak, ILogger uygulamalar Program.cs ve Startup.cs'de bağımlılık ekleme ile kolayca kullanılamaz. Daha fazla bilgi için bkz. .NET'te günlüğe kaydetme: Ana dosyada günlük oluşturma.

Program.cs ve Startup.cs'den günlüğe kaydetme sırasında birkaç sınırlama vardır:

Aşağıdaki örnekler, Program.cs ve Startup.cs'yi açıkça başlatarak ve yapılandırarak bunu gösteriyor.

Örnek Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.ApplicationInsights;

namespace WebApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            var logger = host.Services.GetRequiredService<ILogger<Program>>();
            logger.LogInformation("From Program, running the host now.");

            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .ConfigureLogging((context, builder) =>
                {
                    // Providing an instrumentation key is required if you're using the
                    // standalone Microsoft.Extensions.Logging.ApplicationInsights package,
                    // or when you need to capture logs during application startup, such as
                    // in Program.cs or Startup.cs itself.
                    builder.AddApplicationInsights(
                        context.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]);

                    // Capture all log-level entries from Program
                    builder.AddFilter<ApplicationInsightsLoggerProvider>(
                        typeof(Program).FullName, LogLevel.Trace);

                    // Capture all log-level entries from Startup
                    builder.AddFilter<ApplicationInsightsLoggerProvider>(
                        typeof(Startup).FullName, LogLevel.Trace);
                });
    }
}

Yukarıdaki kodda, ApplicationInsightsLoggerProvider bağlantı dizeniz ile "APPLICATIONINSIGHTS_CONNECTION_STRING" yapılandırılmıştır. Filtreler uygulanır ve günlük düzeyi olarak ayar LogLevel.Trace yapılır.

Önemli

Ölçüm araçları anahtarları üzerinden bağlantı dizelerini öneririz. Yeni Azure bölgeleri için ölçüm araçları yerine bağlantı dizelerinin kullanımı gerekir.

Bağlantı dizesi, telemetri verilerinizle ilişkilendirmek istediğiniz kaynağı tanımlar. Ayrıca, kaynağınız telemetri için hedef olarak kullanmak üzere uç noktaları değiştirmenize de olanak sağlar. Bağlantı dizesini kopyalayıp uygulamanın koduna veya ortam değişkenine eklemeniz gerekir.

Örnek Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace WebApplication
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplicationInsightsTelemetry();
            // Configure the Connection String/Instrumentation key in appsettings.json
        }

        // The ILogger<Startup> is resolved by dependency injection
        // and available in Startup.Configure.
        public void Configure(
            IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
        {
            logger.LogInformation(
                "Configuring for {Environment} environment",
                env.EnvironmentName);

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    await context.Response.WriteAsync("Hello World!");
                });
            });
        }
    }
}

Konsol uygulaması

Yüklü paketler şu şekildedir:

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.0" />
  <PackageReference Include="Microsoft.Extensions.Logging.ApplicationInsights" Version="2.17.0"/>
</ItemGroup>
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.ApplicationInsights;
using System;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            using var channel = new InMemoryChannel();

            try
            {
                IServiceCollection services = new ServiceCollection();
                services.Configure<TelemetryConfiguration>(config => config.TelemetryChannel = channel);
                services.AddLogging(builder =>
                {
                    // Only Application Insights is registered as a logger provider
                    builder.AddApplicationInsights("<YourInstrumentationKey>");
                });

                IServiceProvider serviceProvider = services.BuildServiceProvider();
                ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();

                logger.LogInformation("Logger is working...");
            }
            finally
            {
                // Explicitly call Flush() followed by Delay, as required in console apps.
                // This ensures that even if the application terminates, telemetry is sent to the back end.
                channel.Flush();

                await Task.Delay(TimeSpan.FromMilliseconds(1000));
            }
        }
    }
}

Yukarıdaki örnek paketi Microsoft.Extensions.Logging.ApplicationInsights kullanır. Varsayılan olarak, bu yapılandırma Application Analizler: kanalına veri göndermek için "en TelemetryConfiguration düşük" ayarı InMemoryChannel kullanır. Örnekleme ve standart örnek TelemetryInitializer yoktur. Aşağıdaki örnekte olduğu gibi, bir konsol uygulaması için bu davranışı geçersiz kılabilirsiniz.

Şu ek paketi yükleyin:

<PackageReference Include="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" Version="2.17.0" />

Aşağıdaki bölümde, yöntemi kullanılarak varsayılan kurulumun TelemetryConfiguration nasıl geçersiz kılın olduğu Configure(TOptions) gösterir. Bu örnek, ve ServerTelemetryChannel örneklemeyi ayarlar. 'ye özel TelemetryInitializer bir örnek TelemetryConfiguration ekler.

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.ApplicationInsights;
using System;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            using var channel = new ServerTelemetryChannel();

            try
            {
                IServiceCollection services = new ServiceCollection();
                services.Configure<TelemetryConfiguration>(
                    config =>
                    {
                        config.TelemetryChannel = channel;

                        // Optional: implement your own TelemetryInitializer instance and configure it here
                        // config.TelemetryInitializers.Add(new MyTelemetryInitializer());

                        config.DefaultTelemetrySink.TelemetryProcessorChainBuilder.UseSampling(5);
                        channel.Initialize(config);
                    });

                services.AddLogging(builder =>
                {
                    // Only Application Insights is registered as a logger provider
                    builder.AddApplicationInsights("<YourInstrumentationKey>");
                });

                IServiceProvider serviceProvider = services.BuildServiceProvider();
                ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();

                logger.LogInformation("Logger is working...");
            }
            finally
            {
                // Explicitly call Flush() followed by Delay, as required in console apps.
                // This ensures that even if the application terminates, telemetry is sent to the back end.
                channel.Flush();

                await Task.Delay(TimeSpan.FromMilliseconds(1000));
            }
        }
    }
}

Günlük düzeyi

ILoggeruygulamaları, günlük filtreleme uygulamak için yerleşik bir mekanizmaya sahiptir. Bu filtreleme, Application Analizler sağlayıcısı dahil olmak üzere kayıtlı her sağlayıcıya gönderilen günlükleri denetlemenizi sağlar. Filtrelemeyi yapılandırmada (örneğin, appsettings.json dosyası kullanarak) veya kodda kullanabilirsiniz.

Aşağıdaki örneklerde, 'ye filtre kurallarının nasıl uygulanacakları ApplicationInsightsLoggerProvider gösterılmıştır.

appsettings.json ile yapılandırmada filtre kuralları oluşturma

ApplicationInsightsLoggerProvider , "ApplicationInsights" olarak diğer adıdır. Appsettings.json'ın aşağıdaki bölümü, "Microsoft" ile Analizler üst düzeydeki günlük kategorilerini günlüğe Analizler uygulama günlük LogLevel.Warning düzeyini LogLevel.Error geçersiz kılar.

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    },
    "ApplicationInsights": {
      "LogLevel": {
        "Microsoft": "Error"
      }
    }
  }
}

Kodda filtre kuralları oluşturma

Aşağıdaki kod parçacığı, bu öğeler için gönderilecek ApplicationInsightsLoggerProvider günlükleri yapılandırıyor:

Host.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureLogging(builder =>
    {
        builder.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.Warning);
        builder.AddFilter<ApplicationInsightsLoggerProvider>("Microsoft", LogLevel.Error);
    });

Günlük kapsamları

ApplicationInsightsLoggingProvidergünlük kapsamlarını destekler. Kapsamlar varsayılan olarak etkindir.

Kapsam türünde ise, koleksiyonda her anahtar/değer çifti, özel özellikler olarak IReadOnlyCollection<KeyValuePair<string,object>> uygulama Analizler telemetri verilerine eklenir. Aşağıdaki örnekte, günlükler olarak yakalanır TraceTelemetry ve özelliklere ("MyKey", "MyValue") sahip olur.

using (_logger.BeginScope(new Dictionary<string, object> { ["MyKey"] = "MyValue" }))
{
    _logger.LogError("An example of an Error level message");
}

Kapsam olarak başka bir tür kullanılıyorsa, application Scope Analizler telemetrisinde özelliği altında depolanır. Aşağıdaki örnekte, TraceTelemetry kapsamı içeren adlı Scope bir özelliği olacak.

    using (_logger.BeginScope("hello scope"))
    {
        _logger.LogError("An example of an Error level message");
    }

Sık sorulan sorular

ApplicationInsightsLoggerProvider'ın eski ve yeni sürümleri nedir?

Microsoft.ApplicationInsights.AspNet SDK'sı, uzantı yöntemleri aracılığıyla etkinleştirildi yerleşik ApplicationInsightsLoggerProvider ( ) örneği Microsoft.ApplicationInsights.AspNetCore.Logging.ApplicationInsightsLoggerProvider ILoggerFactory içerir. Bu sağlayıcı sürüm 2.7.1'den eski olarak işaretlenir. Bir sonraki ana sürüm değişikliğinde tamamen kaldırılacaktır.

Microsoft.ApplicationInsights.AspNetCore 2.6.1 paketinin kendisi eski değildir. İstekler ve bağımlılıklar gibi öğelerin izlenmesini etkinleştirmek için gereklidir.

Önerilen alternatif, microsoft.Extensions.Logging.ApplicationInsightsyeni tek başına ApplicationInsightsLoggerProvider paketidir. Bu paket, gelişmiş bir örneği ( ) ve etkinleştirme için uzantı yöntemlerini Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider ILoggerBuilder içerir.

Microsoft.ApplicationInsights.AspNet SDK sürüm 2.7.1, yeni pakete bağımlıdır ve yakalamayı otomatik ILogger olarak sağlar.

Bazı ILogger günlükleri neden Application Analizler?

üzerinde çağrısıyla etkin olan eski (artık eski) sürümünüz ApplicationInsightsLoggerProvider varsa yineleme AddApplicationInsights ILoggerFactory oluşabilir. Yönteminizin Configure aşağıdaki koda sahip olup olduğunu kontrol edin ve kaldırın:

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
     loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Warning);
     // ..other code.
 }

Hata ayıklaması yapılırken hata ayıklaması Visual Studio, EnableDebugLogger false Application Analizler'i etkinleştiren kodda olarak ayarlayın. Bu yineleme ve düzeltme yalnızca uygulamada hata ayıklarken alakalıdır.

public void ConfigureServices(IServiceCollection services)
{
    var options = new ApplicationInsightsServiceOptions
    {
        EnableDebugLogger = false
    }
    services.AddApplicationInsightsTelemetry(options);
    // ...
}

Microsoft.ApplicationInsights.AspNet SDK sürüm 2.7.1'e güncelleştirildi ve ILogger günlükleri otomatik olarak yakalanır. Nasıl yaparım? tamamen kapatıyor musunuz?

Günlüklerin genel olarak nasıl filtrelenmiş olduğunu görmek için Günlük düzeyi bölümüne bakın. 'ı kapatmak ApplicationInsightsLoggerProvider için, LogLevel.None günlük kaydını yapılandırmak için çağrınızı kullanın. Aşağıdaki komutta builder şu ILoggingBuilder şekildedir: .

builder.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.None);

appsettings.json dosyasındaki değişiklik şu şekildedir:

{
    "Logging": {
        "ApplicationInsights": {
            "LogLevel": {
                "Default": "None"
            }
        }
    }
}

Bazı ILogger günlükleri neden diğer günlükler ile aynı özelliklere sahip değil?

Uygulama Analizler her telemetri için kullanılan bilgileri kullanarak günlükleri yakalar ILogger TelemetryConfiguration ve gönderir. Ancak bir özel durum vardır. Varsayılan olarak, TelemetryConfiguration Program.cs veya Startup.cs'den oturum aken tam olarak ayarlanmaz. Bu yerlerden gelen günlükler varsayılan yapılandırmaya sahip olmayacaktır, bu nedenle tüm örnekleri TelemetryInitializer ve örnekleri TelemetryProcessor çalıştırmaz.

Microsoft.Extensions.Logging.ApplicationInsights tek başına paketini kullanıyor ve bazı ek özel telemetrileri el ile günlüğe kaydetmeyi istiyorum. Bunu nasıl yapabilirim?

Tek başına paketini kullandığınızda, TelemetryClient bağımlılık ekleme (dı) kapsayıcısına eklenmiş değildir. Aşağıdaki kodun gösterdiği gibi, yeni bir örneği oluşturmanız TelemetryClient ve günlükçü sağlayıcısının kullandığı yapılandırmayı kullanmanız gerekir. Bu, tüm özel telemetri ve telemetri için aynı yapılandırmanın kullanılmasını sağlar ILogger .

public class MyController : ApiController
{
   // This TelemetryClient instance can be used to track additional telemetry through the TrackXXX() API.
   private readonly TelemetryClient _telemetryClient;
   private readonly ILogger _logger;

   public MyController(IOptions<TelemetryConfiguration> options, ILogger<MyController> logger)
   {
        _telemetryClient = new TelemetryClient(options.Value);
        _logger = logger;
   }  
}

Not

Microsoft.ApplicationInsights.AspNetCoreApplication Insights etkinleştirmek için paketini kullanırsanız, bu kodu doğrudan oluşturucuda almak için değiştirin TelemetryClient . Bir örnek için Bu SSSbölümüne bakın.

ılogger günlüklerinden hangi Application Insights telemetri türü üretildi? Application Insights için ılogger günlüklerini nereden görebilirim?

ApplicationInsightsLoggerProvider``ILoggergünlükleri yakalar ve TraceTelemetry bunlardan oluşturur. Bir Exception nesne Log üzerinde yöntemine geçirilirse ILogger , ExceptionTelemetry yerine oluşturulur TraceTelemetry .

bu telemetri öğeleri, TraceTelemetry ExceptionTelemetry Azure portal, analiz veya Visual Studio yerel hata ayıklayıcı dahil olmak üzere Application Insights diğer veya öğeleriyle aynı yerlerde bulunabilir.

Her zaman gönderme yapmayı tercih ediyorsanız TraceTelemetry , şu kod parçacığını kullanın:

builder.AddApplicationInsights(
    options => options.TrackExceptionsAsExceptionTelemetry = false);

SDK yüklü değil ve ASP.NET Core uygulamalarım için Application Insights etkinleştirmek üzere Azure Web Apps uzantısını kullanıyorum. Yeni sağlayıcıyı kullanmak Nasıl yaparım? mı?

Azure Web Apps Application Insights uzantısı yeni sağlayıcıyı kullanır. Uygulamanızın appSettings. JSON dosyasındaki filtreleme kurallarını değiştirebilirsiniz.

Sonraki adımlar